C#怎么实现CQRS模式_C# MediatR命令查询分离教程【高级】
MediatR实现CQRS时,命令继承无泛型IRequest,查询继承IRequest;事务手动管理,DbContext用Scoped注入;INotification仅用于非关键异步通知;查询Handler通过构造函数注入DbContext并启用AsNoTracking(),避免直接new。
MediatR中命令与查询须严格分离:命令继承`IRequest`(无泛型),用`IRequestHandler`;查询继承`IRequest `,用`IRequestHandler `;事务需手动管理,`DbContext`必须Scoped注入;`INotification`仅用于非关键异步通知;查询严禁`new DbContext`,须构造注入并`AsNoTracking()`。

接口签名:命令和查询的“身份边界”
MediatR里,`IRequestHandler事务管理:别指望Send()自带原子性
一个常见的误解是:用了MediatR的`Send()`,命令执行和数据库提交就天然有了原子性。醒醒,`Send()`只是个管道调度器,事务得自己动手管。 最容易翻车的地方有两个:一是在Handler里直接`new DbContext()`,二是依赖注入的上下文没配对生命周期,导致事务跨Handler泄露或失效。 正确的做法并不复杂: - 注册`DbContext`时,老老实实用`AddDbContextINotification:是“广播”不是“命令通道”
新手容易把领域事件(比如`OrderCreatedNotification`)当成查询结果或命令副作用的标配通道,甚至幻想它能保证执行顺序或参与事务。但`INotification`本质上是个发布-订阅机制——无返回值、不保证顺序、默认异步fire-and-forget,典型的一次性通知。 所以它的适用范围很窄:非关键路径的衍生操作。比如发邮件、写日志、更新搜索索引。这些事情晚几秒甚至丢一两条,系统都能容忍。 有几个绝对不能做的事情: - 不要在`INotificationHandler`里修改聚合根或触发另一条命令。一旦这么干,流程就变得不可控,测试也成了噩梦,CQRS的边界形同虚设。 - 如果有强一致性的需求(比如“扣款成功后必须同步更新余额视图”),那应该由主命令的Handler显式调用写入服务,或者用事务性发件箱(Outbox pattern)来处理。依赖`MediatR.Publish()`是想多了。查询Handler里的new DbContext:隐蔽的性能冲击波
有人图省事,在查询Handler里直接写`using var context = new AppDbContext(...)`。看起来简单安全,实际上这是性能雷区——绕过DI生命周期管理,连接池滥用、上下文释放不及时、并发下状态污染,问题一串串。更隐蔽的是,它让查询享受不到EF Core的变更跟踪优化。比如同一请求内多次查同一个实体,Scoped上下文本来可以复用实例,结果每次都重新创建,白白浪费。 解决方案很直接: - 所有Handler一律通过构造函数注入`DbContext`,确保和请求生命周期一致。 - 查询类Handler要显式标记`AsNoTracking()`——除非你真的打算后续再Update。这一行代码能省掉大量内存和性能开销。 - 还有个常见低级错误:先`.ToList()`或`.Count()`拉数据到内存,再在内存里做LINQ过滤。EF Core没办法把后续操作转成SQL,最终全量加载,性能直接拉胯。 说到底,CQRS真正难的不是写几个Handler,而是守住命令与查询的物理隔离。数据库连接、缓存策略、异常处理粒度、监控指标埋点——通通要按角色区分对待。一旦在查询Handler里写了`Sa veChangesAsync()`,或者让命令返回DTO给前端渲染,CQRS就已经退化成普通分层架构了。
WPS Office是一款面向macOS用户的综合办公套件,将文字处理、电子表格、演示文稿、PDF工具、模板与云协作整合在同一应用中。它兼容常见Microsoft Office格式,支持Intel及Apple芯片Mac,基础功能可免费使用,
Shapr3D是一款面向工业设计、机械工程、建筑概念和三维打印工作流的CAD软件。Mac版采用Parasolid建模内核,支持草图约束、实体建模、工程图、可视化渲染及常见CAD格式交换,并可通过账户在多台设备之间同步项目。
REAPER是Cockos开发的数字音频工作站,提供多轨音频与MIDI录制、剪辑、处理、混音和母带制作工具。Mac版兼容Intel与Apple芯片,支持AU、VST、VST3、CLAP等插件格式,并提供高度可定制的工作流程。
Adobe Photoshop 是面向摄影师、设计师和内容创作者的专业图像处理工具,可在 Windows 上完成照片修饰、选区抠图、图层合成、文字排版、绘画及生成式编辑。软件采用订阅授权,由 Creative Cloud 管理安装、更新与许
Adobe InDesign 是面向印刷与数字出版的专业页面排版工具,可制作书籍、杂志、宣传册、海报、交互式 PDF 和电子书。它提供精细的文字样式、多页面管理、印前检查及多格式输出能力,并能与 Photoshop、Illustrator
Adobe Illustrator 是用于绘制矢量图形、插画、图标、徽标和版式的专业设计工具。它以路径和锚点为核心,作品放大后仍能保持清晰,并提供画板、文字、渐变、图像描摹及精确变换等功能,适合品牌视觉、印刷物料、数字界面和商业插画创作。













