不同类库中MediatR查询类注册失效问题及解决方法咨询
MediatR自动注册CQRS查询失效的原因与解决办法
失效原因
Assembly.GetExecutingAssembly()获取的是当前运行的程序集——也就是你的.NET6 Web项目程序集,而你的GetAllProductsQuery等CQRS类放在独立的类库项目中,这个类库程序集不在扫描范围内,所以MediatR无法找到这些类,自动注册自然不生效。
解决办法(无需逐个显式注册)
1. 通过类库中的类型定位程序集
直接用类库中任意一个CQRS类型(比如GetAllProductsQuery)来获取其所在程序集,让MediatR扫描整个类库:
builder.Services.AddMediatR(typeof(GetAllProductsQuery).Assembly);
这种方式最常用,不需要硬编码程序集名称,还能自动适配类库程序集的变更。
2. 直接加载类库程序集
如果明确知道类库的程序集名称,可以直接加载并传入:
var libraryAssembly = Assembly.Load("YourClassLibraryProjectName"); builder.Services.AddMediatR(libraryAssembly);
注意替换YourClassLibraryProjectName为实际的类库项目名称(通常和程序集名称一致,除非手动修改过输出设置)。
3. 扫描多个程序集(多类库场景)
如果CQRS类分散在多个类库中,可以一次性传入多个程序集:
var webAssembly = Assembly.GetExecutingAssembly(); var productLibraryAssembly = typeof(GetAllProductsQuery).Assembly; var orderLibraryAssembly = typeof(GetAllOrdersQuery).Assembly; builder.Services.AddMediatR(webAssembly, productLibraryAssembly, orderLibraryAssembly);
额外注意事项
确保类库中的CQRS类符合MediatR的约定:
- 查询/命令类需实现
IRequest<TResponse>接口 - 对应的处理器类需实现
IRequestHandler<TQuery, TResponse>接口
只有符合约定的类才会被MediatR扫描并注册。
内容的提问来源于stack exchange,提问作者TrypicalDev
相关产品推荐
相关产品推荐

