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

MediatR setup for shared Class Library in Console vs WebAPI

我有一个 .Net Core 2.2 class 库,它使用 CQRS 模式和 MediatR。我将所有依赖项添加到 Main 中的 serviceProvider 并通过以下方式附加 MediatR:

serviceCollection.AddMediatR();
var serviceProvider = serviceCollection.BuildServiceProvider();

一切都很顺利,我可以毫无误地向 MediatR 发送我的任何命令或查询。

我想在 WebApi(也是 .Net Core 2.2)中使用完全相同的库,并在 Startup.ConfigureServices()[=35 中以完全相同的方式设置我的 serviceProvider =] 方法,调用任何使用 MediatR 的控制器时出现以下异常:

InvalidOperationException: Handler was not found for request of type MediatR.IRequestHandler`2[Core.Application.Accounts.Queries.GetAccountListQuery,System.Collections.Generic.List`1[Core.Application.Accounts.Models.AccountViewModel]]. Register your handlers with the container. See the samples in GitHub for examples. MediatR.Internal.RequestHandlerBase.GetHandler(ServiceFactory factory)

我能够通过在将 MediatR 添加到 DI 容器之前显式添加每个命令或查询来解决问题:

services.AddMediatR(typeof(GetAccountListQuery).GetTypeInfo().Assembly);
services.AddMediatR();

但这是否意味着我必须在我的库中注册每个 IRequest 对象? MediatR 如何能够在 Console 应用程序中为我注册它们,而不是在 WebAPI 中?有更好的方法吗?

我看到 建议进行程序集扫描,但是 令我困惑 我的控制台应用程序似乎可以执行此操作自动地。此外,我不确定是否要移动到 Autofac。我已经看到一些包可以帮助您对默认的 ServiceProvider 执行相同的操作 - 但是我真的想避免添加额外的依赖项,除非绝对必要。

只要有这个就够了:

services.AddMediatR(typeof(GetAccountListQuery));

services.AddMediatR(typeof(Startup));

它适用于 ASP.NET Core 2.2。该项目有这两个 NuGet 依赖项:

P.S。对于那些 minuses 的人——来自汇编的任何 class 都可以。我使用 GetAccountListQuery 作为示例,因为它肯定在正确的程序集中。请参阅下面我的评论。