Welcome to OStack Knowledge Sharing Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
4.6k views
in Technique[技术] by (71.8m points)

c# - Execture MediatR request without query

I have a class ProductService.cs which looks like:

public class ProductService : IProductService
{
    private readonly IMediator _mediator;

    public ProductService(IMediator mediator)
    {
        _mediator = mediator;
    }

    public async Task<IQueryable<Models.Product>> GetActiveProducts()
    {
        var products = await _mediator.Send(new FindProducts);
        return products.Where(product => product.Status.Id == (int)ProductStatusEnum.Active);
    }
}

And then my FindProducts looks like so:

public class FindProducts
{
    public class Handler : IRequest<IQueryable<Models.Product>>
    {
        private readonly ApplicationDbContext _dbContext;

        public Handler(ApplicationDbContext dbContext)
        {
            _dbContext = dbContext;
        }

        public IQueryable<Models.Product> Handle()
        {
            return _dbContext.Products
            .Select(p => new Models.Product
            {
               Name = p.Name,
               Status = new ProductStatus
               {
                  Id = p.Status.Id,
                  Status = p.Status.Status
                }
            })
            .AsQueryable();
        }
    }
 }

However this won't compile as I get build errors A new expression requires (), [], or {} after type I've search all over the web and cannot find any examples or documentation on how to send a MediatR request without sending over a Query as ideally this will get all products regardless the product data.

Am I missing something?


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Answer

0 votes
by (71.8m points)

You need to separate it out, your mixing the Mediatr interfaces, for example:

public class FindProducts : IRequest<IQueryable<Models.Product>>
{}

public class FindProductsHandler : IRequestHandler<FindProducts,IQueryable<Models.Product>>
{}

And then call it via:

var query = new FindProducts();
var products = await _mediator.Send(query);

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome to OStack Knowledge Sharing Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...