MediatR v12迁移问题:RequestHandler无法自动检测
MediatR v12升级后无法检测RequestHandlers的解决办法
问题根源
升级到MediatR v12后抛出No service for type 'MediatR.IRequestHandler2[...]' has been registered`异常,核心原因是:
- MediatR v12重构了DI扩展逻辑,默认仅扫描调用
AddMediatR的当前程序集(即Api层) - 你的RequestHandler位于独立的Application层,未被扫描到,导致未注册到DI容器
修复步骤
1. 调整MediatR注册代码
在Api层的Program.cs中,修改AddMediatR的配置,显式指定扫描Application层的程序集:
services.AddMediatR(cfg => { // 方法1:通过Application层的标记类获取程序集(推荐) cfg.RegisterServicesFromAssembly(typeof(Application.AssemblyMarker).Assembly); // 方法2:直接使用Application层中任意Handler的类型 // cfg.RegisterServicesFromAssembly(typeof(GetWeatherQueryHandler).Assembly); });
如果Application层没有标记类,添加一个空类即可:
namespace Application; public class AssemblyMarker { }
2. 验证依赖配置
MediatR v12已将DI扩展集成到主包,无需安装MediatR.Extensions.Microsoft.DependencyInjection,你的v12项目依赖配置是正确的:
- Api项目:保留
MediatR和MediatR.Extensions.FluentValidation.AspNetCore - Application项目:保留
MediatR即可
版本差异说明
- MediatR v11:依赖单独的
MediatR.Extensions.Microsoft.DependencyInjection包,部分场景下默认扫描范围更广 - MediatR v12:DI扩展合并到主包,默认仅扫描当前程序集,必须显式指定其他程序集才能发现跨层的Handler
内容的提问来源于stack exchange,提问作者andre santos
相关产品推荐
相关产品推荐

