c# - MediatR 仅使用 ASP.NET DI 在程序集中注册特定处理程序

标签 c# asp.net .net dependency-injection mediatr

使用 .NET 6 中提供的 DI 支持,有没有一种方法可以仅注册特定的 MediatR 处理程序并避免进行程序集扫描的调用:

builder.Services.AddMediatR(Assembly.GetExecutingAssembly());

我在启动时进行一些条件配置,虽然我的处理程序位于同一程序集中,但我只想根据某些配置时间值注册某些处理程序(以及某些依赖服务)。

我删除了提供的 AddMediatR() 调用,并为我的处理程序添加了显式注册:

services.AddScoped<IRequestHandler<FileProcessingRequest, ProcessingOutputDetails>, FileProcessingRequestHandler>();

但这引发了异常,因为 IMediatR 未注册。

Mediator 注册为 IMediator 导致另一个异常,因为缺少 MediatR 内部依赖项的注册。

AddMediatR() 的所有重载似乎都需要程序集引用。

最佳答案

AddMediatR 方法验证至少已传递一个程序集,它将应用扫描来查找例如处理程序。

来自查看源代码GitHub :

if (!assemblies.Any())
{
    throw new ArgumentException(
        "No assemblies found to scan. Supply at least one assembly to scan for handlers."
        );
}

由于您必须传递程序集,但同时您希望避免找到程序集中的所有处理程序,因此您可以传递不包含任何处理程序的任何其他程序集。

AddMediatR 方法不要求必须找到处理程序。

在下面的代码中,MediatR 程序集本身被传递给 AddMediatR,但您可以使用您选择的任何其他内容。

可以按照您已经执行的方式手动注册应该解析的实际处理程序。

builder.Services.AddMediatR(typeof(IMediator).Assembly);

builder.Services.AddScoped<IRequestHandler<FileProcessingRequest, ProcessingOutputDetails>, FileProcessingRequestHandler>();

关于c# - MediatR 仅使用 ASP.NET DI 在程序集中注册特定处理程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/75934230/

相关文章:

c# - 如何在 SQL Server 2012 中加密某些行的某些列

c# - WPF Listview 空文本

asp.net - ASP MVC外键提交问题

asp.net - asmx Web 服务无法在 IISExpress 上运行

.net - .NET中具有验证功能的OAuth

.net - 像 Java 在 F# 中的静态导入一样吗?

c# - 无法在设计器中创建实例 "[user control]"错误

c# - 如何将此 C# lambda 表达式转换为 VB.Net?

javascript - 永久禁用复选框

c# - 生日日期的正则表达式 asp.net