我有一个.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工厂)
在将MediatR添加到DI容器之前,我可以通过显式添加每个命令或查询来解决此问题:
services.AddMediatR(typeof(GetAccountListQuery).GetTypeInfo().Assembly);
services.AddMediatR();
但这是否意味着我必须在库中注册每个IRequest对象? MediatR如何在控制台应用程序中而不在WebAPI中为我注册它们?有没有更好的方法?
我已经看到this post建议进行程序集扫描,但是令我困惑的是我的控制台应用程序似乎自动执行了此操作。另外,我不确定我是否还想迁移到Autofac。我已经看到一些软件包可以帮助您使用默认的ServiceProvider进行操作-但是,除非绝对必要,否则我真的想避免添加额外的依赖项。
最佳答案
拥有这个应该足够了:
services.AddMediatR(typeof(GetAccountListQuery));
要不就
services.AddMediatR(typeof(Startup));
它在
ASP.NET Core
2.2中对我有用。该项目具有以下两个NuGet
依赖项:MediatR
版本6.0.0MediatR.Extensions.Microsoft.DependencyInjection
版本6.0.1附言对于那些精打细算的人-汇编中的任何类都是可行的。我以
GetAccountListQuery
为例,因为它肯定在正确的程序集中。请在下面查看我的评论。