该程序无法找到 MediatR 查询 ASP.Net Core 的处理程序

Ari*_*ami 12 c# asp.net mediatr asp.net-core

我将 ASP.Net Core 2.2 和 MediatR 框架/库用于查询对象。当我运行程序时,我遇到了这个异常:

InvalidOperationException:找不到 MediatR.IRequestHandler 2[Store.Core.Queries.GetProductTypesQuery,System.Collections.Generic.IEnumerable1[Store.Core.DomainModels.ProductType]]类型请求的处理程序。向容器注册您的处理程序。

我将这些打包添加到我的 Store 项目(主项目)中

1-MediatR 7.0.0

2- MediatR.Extensions.Microsoft.DependencyInjection

这是我的Startup.cs

services.AddMediatR(typeof(Startup));
Run Code Online (Sandbox Code Playgroud)

所以这是我的查询(位于名为“Store.Core”的项目中)

namespace Store.Core.Queries.Products
{
   public class GetProductTypesQuery : IRequest<IEnumerable<ProductType>> { }
}
Run Code Online (Sandbox Code Playgroud)

这是我的QueryHandler(位于另一个名为“Store.Data”的项目中)

namespace Data.Queries.Products
{
    public class GetProductTypesQueryHandler : IRequestHandler<GetProductTypesQuery, IEnumerable<ProductType>>
    {
        private ApplicationDbContext _context;
        public GetProductTypesQueryHandler(ApplicationDbContext context)
        {
            _context = context;
        }

        public async Task<IEnumerable<ProductType>> Handle(GetProductTypesQuery request, CancellationToken cancellationToken)
        {
            return await _context.ProductType.OrderBy(p => p.ProductTypeID).ToListAsync();
        }

    }
}
Run Code Online (Sandbox Code Playgroud)

这是我使用 MediatR 的控制器

namespace Store.Controllers
{
    public class HomeController : Controller
    {
        private readonly IMapper _mapper;
        private readonly IMediator _mediator;
        public HomeController(IMapper mapper, IMediator mediator)
        {
            _mapper = mapper;
            _mediator = mediator;   
        }


        public IActionResult Home() => View();

        [HttpGet]
        public async Task<IActionResult> Dishes(GetProductTypesQuery query) {
            var productTypes = await _mediator.Send(query);
            var productTypesViewModel = _mapper.Map<IEnumerable<ProductTypeVM>>(productTypes);
            return View(productTypesViewModel);
        }
}
}
Run Code Online (Sandbox Code Playgroud)

我的ProductType模型(我认为没有必要,但我添加了它以提供完整信息)

namespace Store.Core.DomainModels
{
    public class ProductType
    {
       public int ProductID { get; set; }
       public string ProductName { get; set; }
    }
}
Run Code Online (Sandbox Code Playgroud)

对我来说唯一可疑的部分是 StartUp.cs(因为我在不同的项目中有查询和查询处理程序)但我不知道我错过了什么。

Ari*_*ami 27

正如我所猜测的,问题在于您添加 MediatR 服务的 Startup.cs。由于我的处理程序在单独的程序集中,所以我们应该提及该程序集名称。我在 Startup.cs 中改变了这个

public void ConfigureServices(IServiceCollection services) {
    services.AddMediatR(typeof(Startup));
}
Run Code Online (Sandbox Code Playgroud)

对此:

public void ConfigureServices(IServiceCollection services){
    var assembly = AppDomain.CurrentDomain.Load("Data");
    services.AddMediatR(assembly);
}
Run Code Online (Sandbox Code Playgroud)

这里的“数据”是我的程序集的名称,所有处理程序都存储在那里。