Mediatr CQRS泛型命令实例创建失败:如何修复泛型声明?
问题原因与解决方法
核心问题
异常的本质是MediatR无法找到与泛型请求MyCustomCommand<CustomPayload1>匹配的泛型IRequestHandler实现,通常是因为泛型Handler未按规则声明,或者DI容器未正确识别并注册该泛型Handler。
具体修改步骤
1. 声明匹配的泛型Handler
创建与泛型请求约束完全对齐的IRequestHandler实现:
// 泛型Handler,与请求的泛型约束保持一致 public class MyCustomCommandHandler<T> : IRequestHandler<MyCustomCommand<T>, CustomResponse> where T : ICustomPayload, new() { // 按需注入依赖 public MyCustomCommandHandler() { // 初始化逻辑 } public async Task<CustomResponse> Handle(MyCustomCommand<T> request, CancellationToken cancellationToken) { // 编写命令处理的业务逻辑 return await Task.FromResult(new CustomResponse()); } }
2. 确保DI容器正确注册泛型Handler
在服务注册环节,让MediatR扫描到这个泛型Handler(以ASP.NET Core为例):
// 注册MediatR并指定包含泛型Handler的程序集 builder.Services.AddMediatR(cfg => cfg.RegisterServicesFromAssemblyContaining<MyCustomCommandHandler<>>());
注意:这里使用
MyCustomCommandHandler<>(不带具体类型的开放泛型),让MediatR识别这是泛型Handler,自动为所有符合约束的T生成对应实例。
3. 可选:简化请求的泛型约束(非必需)
如果业务场景不需要强制T有无参构造,可以移除new()约束,提升灵活性:
public record MyCustomCommand<T> : IRequest<CustomResponse> where T : ICustomPayload { public T Payload { get; init; } public string Param1 { get; init; } public int Param2 { get; init; } public MyCustomCommand(T payload, string param1, int param2) { Payload = payload; Param1 = param1; Param2 = param2; } }
验证效果
修改完成后,原客户端调用代码无需改动,DI容器会自动为MyCustomCommand<CustomPayload1>匹配对应的MyCustomCommandHandler<CustomPayload1>实例,MediatR即可正常处理请求。
内容的提问来源于stack exchange,提问作者Jason Bee
相关产品推荐
相关产品推荐

