.NET 6中如何仅注册指定MediatR处理器并避免程序集扫描?
在.NET 6中仅注册特定MediatR处理器(避免程序集扫描)
当然可以实现按需注册指定的MediatR处理器,不需要强制执行程序集扫描。核心思路是借助MediatR的配置API手动添加目标处理器,同时让框架自动完成必要内部服务的注册,避免手动注册所有依赖的繁琐。
方法一:使用MediatR配置委托精准添加处理器
直接调用AddMediatR的配置重载,在委托里根据配置条件手动添加需要的处理器,这样既自动注册了MediatR的核心依赖(如IMediator、ServiceFactory等),又不会扫描整个程序集:
builder.Services.AddMediatR(cfg => { // 根据配置参数判断是否注册指定处理器 var enableFileProcessing = builder.Configuration.GetValue<bool>("FeatureFlags:EnableFileProcessing"); if (enableFileProcessing) { // 添加单个处理器 cfg.AddHandler<FileProcessingRequestHandler>(); } // 可添加其他条件注册的处理器 // if (xxx) cfg.AddHandler<AnotherRequestHandler>(); });
这种方式是最简洁的,既能满足条件注册需求,又不用操心MediatR内部服务的注册问题。
方法二:完全手动注册(不依赖AddMediatR的自动逻辑)
如果想完全手动控制所有注册步骤,需要先注册MediatR的核心依赖,再注册你的处理器:
- 注册MediatR核心服务:
// 注册ServiceFactory(MediatR内部用于解析服务的委托) builder.Services.AddSingleton<ServiceFactory>(serviceProvider => serviceProvider.GetService); // 注册IMediator及相关接口 builder.Services.AddScoped<IMediator, Mediator>(); builder.Services.AddScoped<ISender>(sp => sp.GetRequiredService<IMediator>()); builder.Services.AddScoped<IPublisher>(sp => sp.GetRequiredService<IMediator>());
- 条件注册你的处理器:
var enableFileProcessing = builder.Configuration.GetValue<bool>("FeatureFlags:EnableFileProcessing"); if (enableFileProcessing) { builder.Services.AddScoped<IRequestHandler<FileProcessingRequest, ProcessingOutputDetails>, FileProcessingRequestHandler>(); }
这种方式适合需要极致控制注册流程的场景,但需要自己维护MediatR内部服务的兼容性,后续MediatR版本更新可能需要调整。
为什么之前的尝试报错?
你之前只注册了IRequestHandler但未注册MediatR的核心服务(如IMediator、ServiceFactory),所以会抛出未找到IMediatR的异常;手动注册Mediator后,又缺少ServiceFactory等内部依赖,导致后续报错。通过上面的两种方法,可以同时解决这两个问题。
内容的提问来源于stack exchange,提问作者smk081
相关产品推荐
相关产品推荐

