如何在.NET 5中通过接口而非类解析MediatR的IRequestHandler?
调整步骤
1. 修改Query接口继承关系
将你定义的IGetDeviceByIMEI接口继承MediatR的IRequest<T>,这样MediatR可以识别该接口为合法的请求类型:
public interface IGetDeviceByIMEI : IRequest<DeviceWrapperDataView> { string IMEI { get; set; } }
2. 调整Query实现类
原有的GetDeviceByIMEI类不需要再直接继承IRequest<T>,改为仅实现IGetDeviceByIMEI接口即可:
public class GetDeviceByIMEI: IGetDeviceByIMEI { public string IMEI { get; set; } public GetDeviceByIMEI(string imei) { this.IMEI = imei; } }
3. 改写Handler绑定规则
将Handler的泛型绑定从具体Query类改为Query接口,同时修改Handle方法的入参类型为接口:
public class GetDeviceByIMEIEventHandler : IRequestHandler<IGetDeviceByIMEI, DeviceWrapperDataView>, IGetDeviceByIMEIEventHandler { private readonly IDeviceEntity _DeviceEntity; public GetDeviceByIMEIEventHandler(IDeviceEntity DeviceEntity) { _DeviceEntity = DeviceEntity; } public async Task<DeviceWrapperDataView> Handle(IGetDeviceByIMEI request, CancellationToken cancellationToken) { // 原有数据查询逻辑保持不变 return DeviceOutput; } }
4. DI容器注册接口映射
在Program.cs/Startup.cs的服务注册逻辑中,添加Query接口和实现类的映射关系:
// 生命周期可根据业务需要调整为Scoped/Singleton services.AddTransient<IGetDeviceByIMEI, GetDeviceByIMEI>();
5. 调整Controller调用逻辑
不再直接new具体Query类,改为从DI容器获取接口实例,赋值后发送请求即可:
private readonly IMediator _mediator; private readonly IServiceProvider _serviceProvider; public DeviceController( IMediator mediator, IServiceProvider serviceProvider) { _mediator = mediator; _serviceProvider = serviceProvider; } [HttpGet()] public async Task<IActionResult> GetDeviceByIMEI(string imei) { var request = _serviceProvider.GetRequiredService<IGetDeviceByIMEI>(); request.IMEI = imei; var result = await _mediator.Send(request); // 后续返回逻辑保持不变 }
注意事项
如果业务中存在多个IGetDeviceByIMEI接口的实现类,需要在DI注册时指定命名或者Key区分,避免MediatR匹配到错误的Handler。单实现场景下无需额外处理。
内容的提问来源于stack exchange,提问作者K.Z
相关产品推荐
相关产品推荐

