0

0

Dapper如何结合MediatR使用 Dapper与CQRS模式实践

星降

星降

发布时间:2025-12-26 08:54:12

|

358人浏览过

|

来源于php中文网

原创

Dapper 结合 MediatR 实现 CQRS 的本质是将读写逻辑剥离至职责清晰的 Handler:Dapper 以轻量高效方式执行原生 SQL,适配命令侧事务与查询侧性能需求,MediatR 通过管道行为统一处理日志、校验与异常,三层结构明确分离关注点。

dapper如何结合mediatr使用 dapper与cqrs模式实践

用 Dapper 结合 MediatR 实现 CQRS,本质是把“写逻辑”和“读逻辑”从 API 层剥离,交给职责清晰的 Handler 去执行,而 Dapper 负责高效、可控地操作数据库。它不依赖复杂 ORM 的抽象,又比裸 ADO.NET 更简洁——刚好匹配 CQRS 对读写分离、轻量可控的要求。

Dapper 在命令(Command)侧的落地方式

命令操作关注数据变更、事务、业务校验。Dapper 的 Execute 方法天然适配这类场景,返回影响行数可直接用于结果判断。

  • IRequestHandler 中,用 Dapper 执行 INSERT/UPDATE/DELETE SQL
  • 手动开启事务:通过 connection.BeginTransaction() 包裹多个 Dapper 操作,确保一致性
  • 参数绑定推荐使用匿名对象或强类型 DTO,避免字符串拼接;例如:conn.Execute("UPDATE Bookings SET Status = @Status WHERE Id = @Id", new { Status = "Reserved", Id = cmd.Id })
  • 命令 Handler 中不查业务状态?错——必要时可用 Dapper 同步查一次(比如检查库存是否充足),但不要做复杂 JOIN 或分页,那是 Query 的事

Dapper 在查询(Query)侧的典型用法

查询只读、高频、强调性能与灵活性。Dapper 的 Query 系列方法(Query、QueryFirst、QuerySingle、QueryMultiple)配合原生 SQL,能精准控制执行计划和映射行为。

  • 定义 IRequestHandler,内部用 Dapper.QueryAsync 直接映射结果
  • 复杂报表类查询可搭配 QueryMultiple 一次性拉取主子表数据,再手动组装 DTO,省去 N+1 和 EF 的延迟加载开销
  • 避免在 Query Handler 中调用领域服务或触发领域事件——查询无副作用,这是 CQRS 的铁律
  • 可结合缓存:比如用 IDistributedCache 缓存热门查询结果,Key 可基于查询参数哈希生成

MediatR 管道行为 + Dapper 的协同增效

MediatR 的管道行为(Pipeline Behavior)不是装饰器,而是对所有请求统一拦截的“横切点”。Dapper 本身不提供日志或异常包装,但借助 Behavior 就能低成本补全。

剪映
剪映

一款全能易用的桌面端剪辑软件

下载
  • LoggingBehavior:在 Execute 前后记录 SQL 语句(注意脱敏参数)、耗时、影响行数——这对排查慢查询和误更新极有用
  • ValidatorBehavior:在命令进入 Dapper 执行前,校验 DTO 必填字段、格式、业务规则(如日期不能早于今天),失败直接返回错误,不碰数据库
  • ExceptionBehavior:捕获 Dapper 抛出的 SqlException,统一转为 Result.Failure 或特定 API 错误码,避免敏感信息泄露

结构组织与依赖管理要点

代码怎么放,直接影响可维护性。CQRS 不是加一堆文件夹,而是让每层意图一目了然。

  • Commands 和 Queries 分开命名空间,例如 Application.Bookings.Commands.ReserveBookingCommandApplication.Bookings.Queries.GetBookingQuery
  • Dapper 相关代码(如 IDbConnection 注入、SQL 文件管理)放在 Infrastructure 层,Application 层只依赖抽象接口(如 IDbConnectionFactory
  • 注册 MediatR 时启用自动扫描:services.AddMediatR(cfg => cfg.RegisterServicesFromAssembly(typeof(Program).Assembly));,Handler 类必须 public 且实现对应泛型接口
  • 避免在 Handler 中 new SqlConnection —— 用 DI 注入连接工厂或已配置好的 connection(如带重试策略的 DbConnection)

基本上就这些。Dapper 提供肌肉,MediatR 提供神经,CQRS 提供骨架——三者合起来,不是堆技术,而是让每次数据库操作都目的明确、路径清晰、问题好追。

相关专题

更多
数据分析工具有哪些
数据分析工具有哪些

数据分析工具有Excel、SQL、Python、R、Tableau、Power BI、SAS、SPSS和MATLAB等。详细介绍:1、Excel,具有强大的计算和数据处理功能;2、SQL,可以进行数据查询、过滤、排序、聚合等操作;3、Python,拥有丰富的数据分析库;4、R,拥有丰富的统计分析库和图形库;5、Tableau,提供了直观易用的用户界面等等。

673

2023.10.12

SQL中distinct的用法
SQL中distinct的用法

SQL中distinct的语法是“SELECT DISTINCT column1, column2,...,FROM table_name;”。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

319

2023.10.27

SQL中months_between使用方法
SQL中months_between使用方法

在SQL中,MONTHS_BETWEEN 是一个常见的函数,用于计算两个日期之间的月份差。想了解更多SQL的相关内容,可以阅读本专题下面的文章。

344

2024.02.23

SQL出现5120错误解决方法
SQL出现5120错误解决方法

SQL Server错误5120是由于没有足够的权限来访问或操作指定的数据库或文件引起的。想了解更多sql错误的相关内容,可以阅读本专题下面的文章。

1082

2024.03.06

sql procedure语法错误解决方法
sql procedure语法错误解决方法

sql procedure语法错误解决办法:1、仔细检查错误消息;2、检查语法规则;3、检查括号和引号;4、检查变量和参数;5、检查关键字和函数;6、逐步调试;7、参考文档和示例。想了解更多语法错误的相关内容,可以阅读本专题下面的文章。

355

2024.03.06

oracle数据库运行sql方法
oracle数据库运行sql方法

运行sql步骤包括:打开sql plus工具并连接到数据库。在提示符下输入sql语句。按enter键运行该语句。查看结果,错误消息或退出sql plus。想了解更多oracle数据库的相关内容,可以阅读本专题下面的文章。

671

2024.04.07

sql中where的含义
sql中where的含义

sql中where子句用于从表中过滤数据,它基于指定条件选择特定的行。想了解更多where的相关内容,可以阅读本专题下面的文章。

563

2024.04.29

sql中删除表的语句是什么
sql中删除表的语句是什么

sql中用于删除表的语句是drop table。语法为drop table table_name;该语句将永久删除指定表的表和数据。想了解更多sql的相关内容,可以阅读本专题下面的文章。

406

2024.04.29

笔记本电脑卡反应很慢处理方法汇总
笔记本电脑卡反应很慢处理方法汇总

本专题整合了笔记本电脑卡反应慢解决方法,阅读专题下面的文章了解更多详细内容。

1

2025.12.25

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Java 教程
Java 教程

共578课时 | 37.7万人学习

国外Web开发全栈课程全集
国外Web开发全栈课程全集

共12课时 | 0.9万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号