我有一个.Net Core 2.2类库,该库与MediatR一起使用CQRS模式。我将所有依赖项添加到Main中的serviceProvider中,并通过以下方式附加MediatR:
serviceCollection.AddMediatR();
var serviceProvider = serviceCollection.BuildServiceProvider();
一切工作都像灵符一样,我能够将我的任何命令或查询毫无问题地发送到MediatR。
我想在WebApi(也是.Net Core 2.2)中使用相同的库,并在 Startup.ConfigureServices()方法内以完全相同的方式设置serviceProvider,然后得到调用使用MediatR的任何控制器时出现以下异常:
InvalidOperationException:未找到类型为MediatR.IRequestHandler`2 [Core.Application.Accounts.Queries.GetAccountListQuery,System.Collections.Generic.List`1 [Core.Application.Accounts.Models.AccountViewModel]的请求的处理程序] 。在容器中注册您的处理程序。有关示例,请参见GitHub中的示例。 MediatR.Internal.RequestHandlerBase.GetHandler(ServiceFactory factory)
我能够通过在将MediatR添加到DI容器之前显式添加每个命令或查询来解决此问题:
services.AddMediatR(typeof(GetAccountListQuery).GetTypeInfo().Assembly);
services.AddMediatR();
但这是否意味着我必须在库中注册每个 IRequest 对象? MediatR 如何能够在 Console 应用程序中而不在 WebAPI 中为我注册?有没有更好的方法?
我已经看到this post建议使用程序集扫描,但是我的控制台应用程序似乎自动执行了此操作,但 困惑 。另外,我不确定我现在是否要移至 Autofac 。我见过一些软件包可以帮助您使用默认的ServiceProvider进行操作-但是,除非绝对必要,否则我真的想避免添加额外的依赖项。
答案 0 :(得分:3)
拥有这个就足够了:
services.AddMediatR(typeof(GetAccountListQuery));
或者只是
services.AddMediatR(typeof(Startup));
它在ASP.NET Core
2.2中对我有效。该项目具有以下两个NuGet
依赖项:
MediatR
版本6.0.0 MediatR.Extensions.Microsoft.DependencyInjection
版本6.0.1 P.S。对于那些精打细算的人-汇编中的任何类都是可行的。我以GetAccountListQuery
为例,因为它肯定在正确的程序集中。请在下面查看我的评论。