控制台与WebAPI中共享类库的MediatR设置

时间:2018-12-29 07:37:54

标签: c# asp.net-core asp.net-core-webapi cqrs mediatr

我有一个.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进行操作-但是,除非绝对必要,否则我真的想避免添加额外的依赖项。

1 个答案:

答案 0 :(得分:3)

拥有这个就足够了:

services.AddMediatR(typeof(GetAccountListQuery));

或者只是

services.AddMediatR(typeof(Startup));

它在ASP.NET Core 2.2中对我有效。该项目具有以下两个NuGet依赖项:

P.S。对于那些精打细算的人-汇编中的任何类都是可行的。我以GetAccountListQuery为例,因为它肯定在正确的程序集中。请在下面查看我的评论。