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:使用标记类统一管理(推荐)
为每个类库创建一个空的标记类,避免依赖具体的业务类型(比如命令/处理器),后续类型改名或重构时无需修改注册代码:
- 在
MyApp.ClassLibrary1中添加标记类:
namespace MyApp.ClassLibrary1; public class MediatRHandlersMarker { }
- 在
MyApp.ClassLibrary2中添加标记类:
namespace MyApp.ClassLibrary2; public class MediatRCommandsMarker { }
- 在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
相关产品推荐
相关产品推荐

