You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.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的核心依赖,再注册你的处理器:

  1. 注册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>());
  1. 条件注册你的处理器:
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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 03:05:30