使用 .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/