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

ASP.NET 6跨类库使用MediatR的注册异常问题求助

解决ASP.NET 6中MediatR跨类库批量注册问题

你遇到的问题核心是:AddMediatR(typeof(Startup).Assembly)仅会扫描ASP.NET API项目的程序集,但你的命令处理器在MyApp.ClassLibrary1、命令在MyApp.ClassLibrary2,这两个程序集未被扫描到,导致MediatR无法注册所需的处理程序,从而抛出Register your handlers with the container.异常。

以下是几种可行的解决方案:

方案1:直接指定所有相关程序集

直接将包含MediatR处理程序、命令/查询的所有类库程序集传入AddMediatR,这是最直接的实现方式:

// 方式1:逐个注册程序集
builder.Services.AddMediatR(cfg =>
{
    // 扫描包含处理器的类库
    cfg.RegisterServicesFromAssembly(typeof(ExampleCommandHandler).Assembly);
    // 扫描包含命令的类库
    cfg.RegisterServicesFromAssembly(typeof(ExampleCommand).Assembly);
});

// 方式2:批量传入程序集数组
var mediatRAssemblies = new[]
{
    typeof(ExampleCommandHandler).Assembly,
    typeof(ExampleCommand).Assembly
};
builder.Services.AddMediatR(cfg => cfg.RegisterServicesFromAssemblies(mediatRAssemblies));

方案2:使用标记类统一管理(推荐)

为每个类库创建一个空的标记类,避免依赖具体的业务类型(比如命令/处理器),后续类型改名或重构时无需修改注册代码:

  1. 在MyApp.ClassLibrary1中添加标记类:
namespace MyApp.ClassLibrary1;
public class MediatRHandlersMarker { }
  1. 在MyApp.ClassLibrary2中添加标记类:
namespace MyApp.ClassLibrary2;
public class MediatRCommandsMarker { }
  1. 在API项目的Program.cs中注册:
builder.Services.AddMediatR(cfg =>
{
    cfg.RegisterServicesFromAssembly(typeof(MediatRHandlersMarker).Assembly);
    cfg.RegisterServicesFromAssembly(typeof(MediatRCommandsMarker).Assembly);
});

方案3:通过程序集名称加载

如果知道类库的程序集名称(通常与项目名称一致,除非手动修改),可以直接加载程序集:

using System.Reflection;

var handlersAssembly = Assembly.Load("MyApp.ClassLibrary1");
var commandsAssembly = Assembly.Load("MyApp.ClassLibrary2");

builder.Services.AddMediatR(cfg => 
    cfg.RegisterServicesFromAssemblies(handlersAssembly, commandsAssembly));

注意:程序集名称需与类库的输出程序集名称完全一致,避免拼写错误。

内容的提问来源于stack exchange,提问作者João Pedro

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 05:01:01