.NET 6中MediatR未注册IRequestHandler问题及自动注册咨询
解决MediatR自动注册独立Application项目中处理器的问题
问题根源在于你当前仅扫描了Web项目的程序集(Assembly.GetExecutingAssembly()),而查询、命令及处理器都在独立的Application项目中,未被纳入扫描范围,导致DI容器找不到对应的IRequestHandler实现。
以下是几种自动完成注册的可行方案:
方案1:使用标记类获取Application程序集(推荐)
在Application项目中定义一个空的标记类/接口,作为程序集的锚点,后续通过这个类型自动定位到Application项目的程序集:
- 在Application项目中添加标记类:
namespace YourApp.Application; // 空标记类,仅用于定位程序集 public class ApplicationAssemblyMarker { }
- 在Web项目的Program.cs中修改MediatR注册代码:
builder.Services.AddMediatR(cfg => cfg.RegisterServicesFromAssembly(typeof(ApplicationAssemblyMarker).Assembly));
这种方式无需硬编码程序集名称,后续在Application项目中新增的查询、处理器都会被自动扫描注册,维护成本最低。
方案2:通过程序集名称加载
如果明确知道Application项目的程序集名称,可以直接加载该程序集进行注册:
var applicationAssembly = Assembly.Load("YourApp.Application"); builder.Services.AddMediatR(cfg => cfg.RegisterServicesFromAssembly(applicationAssembly));
注意:需确保程序集名称拼写完全一致,若后续程序集名称变更,需同步修改此处代码。
方案3:批量扫描多个相关程序集
如果存在多个包含MediatR类型的类库项目(如Domain、Infrastructure等),可以一次性扫描多个程序集:
builder.Services.AddMediatR(cfg => cfg.RegisterServicesFromAssemblies( typeof(ApplicationAssemblyMarker).Assembly, // 可添加其他需要扫描的程序集标记类 typeof(DomainAssemblyMarker).Assembly));
内容的提问来源于stack exchange,提问作者mbahojlo
相关产品推荐
相关产品推荐

