电话
400 9058 355
MediatR 初始化必须注册 IMediator 接口,否则注入时抛 InvalidOperationException;ASP.NET Core 6+ 用 AddMediatR(),跨类库需显式传入程序集;IRequest 用于无返回值操作,IRequest 用于需返回值场景;Handler 必须严格匹配泛型参数;CQRS 核心是职责与模型隔离,非仅命名;管道行为适合横切逻辑但需注意执行顺序与异常处理;数据一致性策略才是 CQRS 复杂所在。
不注册 IMediator 就直接注入会报 InvalidOperationException: Unable to resolve service for type 'MediatR.IMediator'。ASP.NET Core 6+ 默认用 AddMediatR() 扩展方法,但要注意参数——它默认只扫描当前程序集,跨类库时得显式传入程序集:
services.AddMediatR(cfg => cfg.RegisterServicesFromAssembly(typeof(Program).Assembly));
AddMediatR(typeof(CreateUserCommandHandler).Assembly)
using MediatR;,否则 AddMediatR 方法不可见
写请求类时,用 IRequest 表示“只发不收”(如发送邮件、触发日志),用 IRequest 表示“发完要等结果”(如查用户、生成订单号)。选错会导致编译失败或运行时报 Cannot convert lambda expression 类型错误:
public record CreateUserCommand(string Name) : IRequest;
public record GetUserQuery(Guid Id) : IRequest;
public class GetUserQueryHandler : IRequestHandler
很多人以为只要把类名写成 “Query/Command” 就算 CQRS,其实核心是:查询不改状态、命令不返回领域数据、读写模型物理隔离(哪怕一开始共用 EF Core DbContext)。常见踩坑点:
IRequestHandler 里调用 _context.SaveChanges() —— 这属于命令逻辑,不该出现在 Query Handler 中Entity 而非 DTO,导致序列化时触发 EF 延迟加载或循环引用比如日志、验证、权限检查,用 IPipelineBehavior 比在每个 Handler 里重复写更干净。但要注意执行顺序和异常传播:
AddTransient
ValidationException 不该被吞掉,否则前端拿不到具体错误字段
邮箱:8955556@qq.com
Q Q:8955556
本文详解如何将Go官方present工具(用于生成HTML5...
PySNMP在不同版本中对SNMP错误状态(errorSta...
time.Sleep仅阻塞当前goroutine,其他gor...
PHPfopen()创建含特殊符号的文件名失败主因是操作系统...
WooCommerce中通过代码为分组产品动态聚合子商品的属...
io.ReadFull返回io.ErrUnexpectedE...
本文详解Yii2中控制器向视图传递ActiveRecord数...
本文详解为何通过wp_set_object_terms()为...
Pytest中使用@mock.patch类装饰器会导致补丁泄...
带缓冲的channel是并发安全的FIFO队列;make(c...