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<reservebookingcommand result></reservebookingcommand> 中,用 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,能精准控制执行计划和映射行为。

千问智学
千问智学

阿里旗下AI教育应用(原夸克学习APP)

下载
  • 定义 IRequestHandler<getbookingquery bookingdto></getbookingquery>,内部用 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 提供骨架——三者合起来,不是堆技术,而是让每次数据库操作都目的明确、路径清晰、问题好追。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

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

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

1090

2023.10.12

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

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

339

2023.10.27

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

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

380

2024.02.23

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

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

1988

2024.03.06

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

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

379

2024.03.06

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

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

1540

2024.04.07

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

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

585

2024.04.29

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

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

438

2024.04.29

Swift iOS架构设计与MVVM模式实战
Swift iOS架构设计与MVVM模式实战

本专题聚焦 Swift 在 iOS 应用架构设计中的实践,系统讲解 MVVM 模式的核心思想、数据绑定机制、模块拆分策略以及组件化开发方法。内容涵盖网络层封装、状态管理、依赖注入与性能优化技巧。通过完整项目案例,帮助开发者构建结构清晰、可维护性强的 iOS 应用架构体系。

3

2026.03.03

热门下载

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

精品课程

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

共578课时 | 76.2万人学习

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

共12课时 | 1万人学习

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

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