Handyman.Mediator无响应IRequestHandler实现报错,求极简解决方法
问题分析与解决方案
问题根源
Handyman.Mediator 11.3中,IRequestHandler<TRequest>是IRequestHandler<TRequest, Handyman.Mediator.Void>的语法糖别名。你的自定义接口IHandlerWithoutResponse继承该接口后,实际要求实现的方法签名是Task<Handyman.Mediator.Void> Handle(...)。而C#中Task与Task<T>属于不兼容类型,直接返回Task的方法无法匹配接口要求,因此触发编译错误。
极简实现方案
方案1:抽象基类封装(推荐,适配多处理器场景)
自定义抽象基类封装Void类型的返回逻辑,子类只需专注实现业务逻辑:
// 自定义抽象基类,适配框架的Void返回要求 public abstract class AsyncVoidRequestHandler<TRequest> : IHandlerWithoutResponse where TRequest : RequestWithoutResponse { // 显式实现接口方法,统一处理Void返回 async Task<Handyman.Mediator.Void> IRequestHandler<RequestWithoutResponse, Handyman.Mediator.Void>.Handle(RequestWithoutResponse request, CancellationToken cancellationToken) { await Handle((TRequest)request, cancellationToken); return Handyman.Mediator.Void.Instance; // 使用框架单例,避免重复实例化 } // 子类仅需实现此返回Task的方法 protected abstract Task Handle(TRequest request, CancellationToken cancellationToken); } // 业务处理器实现 public class HandlerWithoutResponse : AsyncVoidRequestHandler<RequestWithoutResponse> { protected override async Task Handle(RequestWithoutResponse request, CancellationToken cancellationToken) { // 编写业务逻辑,无需关心Void返回 await Task.CompletedTask; } }
方案2:显式接口实现(适配单个处理器场景)
在实现类中显式完成接口要求的方法,同时提供符合编码习惯的Task返回方法:
public class HandlerWithoutResponse : IHandlerWithoutResponse { // 显式实现接口要求的方法,内部调用业务方法 async Task<Handyman.Mediator.Void> IRequestHandler<RequestWithoutResponse, Handyman.Mediator.Void>.Handle(RequestWithoutResponse request, CancellationToken cancellationToken) { await Handle(request, cancellationToken); return Handyman.Mediator.Void.Instance; } // 业务逻辑写在此处,返回Task符合异步无返回编码习惯 public async Task Handle(RequestWithoutResponse request, CancellationToken cancellationToken) { // 编写你的业务代码 await Task.CompletedTask; } }
关键说明
- 抽象基类方案可避免重复编写
Void返回的模板代码,保持代码简洁性,适合多个无响应处理器的场景。 - 使用
Handyman.Mediator.Void.Instance单例替代new Void(),减少不必要的对象创建。
内容的提问来源于stack exchange,提问作者jeancallisti
相关产品推荐
相关产品推荐

