在MediatR中,一个QueryHandler类实现两个Handle方法是否可行?
在MediatR中一个类实现多个Handle方法是否可行?
完全可行,MediatR原生支持一个类实现多个IRequestHandler<TRequest, TResponse>接口,你的写法是完全正确的。
核心逻辑
MediatR通过请求类型匹配对应的处理程序,只要每个Handle方法对应不同的IRequest实现(比如你代码里的GetOtherRoundsQuery和IsOtherRoundExist),框架就能准确找到对应请求的处理逻辑,不会出现方法冲突。
你的实现优势
你将共享的复杂查询逻辑封装在GetQuery()私有方法中,让两个Handle复用这段代码的做法非常合理:
- 避免重复代码,符合DRY原则
- 相关查询逻辑集中管理,后续维护更方便
- 无需为了拆分逻辑强行创建冗余的单独处理类
代码示例验证
你的代码写法完全符合MediatR的规范:
public record GetOtherRoundsQuery() : IRequest<RoundDb[]>; public record IsOtherRoundExist() : IRequest<bool>; public class OtherRoundsQueryHandler : IRequestHandler<GetOtherRoundsQuery, RoundDb[]>, IRequestHandler<IsOtherRoundExist, bool> { public Task<RoundDb[]> Handle(GetOtherRoundsQuery request, CancellationToken cancellationToken) { return GetQuery().ToArrayAsync(); } public Task<bool> Handle(IsOtherRoundExist request, CancellationToken cancellationToken) { return GetQuery().AnyAsync(); } private IQueryable<RoundDb> GetQuery() { //return a complex query implementation } }
额外提示
- 确保每个
Handle方法的签名严格匹配对应IRequestHandler接口的要求(请求类型和返回类型必须一一对应) - 在依赖注入容器中注册这个处理类时,MediatR会自动识别它实现的所有
IRequestHandler接口,无需额外配置
内容的提问来源于stack exchange,提问作者Grigory Zhadko
相关产品推荐
相关产品推荐

