全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

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

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

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


# app  # ai  # 延迟加载  # .net  # sql  # 命名空间  # 字符串  # 接口  #   # public  # 泛型  # delete  # 对象  # 事件  # typeof  # 数据库  # 行数  # 这是  # 放在  # 那是  # 就能  # 多个  # 推荐使用  # 这类  # 要做  # 这对 


相关文章: 建站主机选购指南与交易推荐:核心配置解析  西安市网站制作公司,哪个相亲网站比较好?西安比较好的相亲网站?  如何在Mac上搭建Golang开发环境_使用Homebrew安装和管理Go版本  实例解析Array和String方法  网站制作大概多少钱一个,做一个平台网站大概多少钱?  建站之星在线客服如何快速接入解答?  免费ppt制作网站,有没有值得推荐的免费PPT网站?  家族网站制作贴纸教程视频,用豆子做粘帖画怎么制作?  临沂网站制作公司有哪些,临沂第四中学官网?  济南企业网站制作公司,济南社保单位网上缴费步骤?  JS中使用new Date(str)创建时间对象不兼容firefox和ie的解决方法(两种)  如何设计高效校园网站?  如何挑选最适合建站的高性能VPS主机?  电商网站制作公司有哪些,1688网是什么意思?  建站之星会员如何解锁更多建站功能?  如何通过.red域名打造高辨识度品牌网站?  一键网站制作软件,义乌购一件代发流程?  在线制作视频网站免费,都有哪些好的动漫网站?  制作电商网页,电商供应链怎么做?  如何快速搭建高效香港服务器网站?  C#如何使用XPathNavigator高效查询XML  如何在阿里云服务器自主搭建网站?  北京网页设计制作网站有哪些,继续教育自动播放怎么设置?  相亲简历制作网站推荐大全,新相亲大会主持人小萍萍资料?  如何快速查询域名建站关键信息?  实例解析angularjs的filter过滤器  如何安全更换建站之星模板并保留数据?  如何高效配置IIS服务器搭建网站?  建站之星后台搭建步骤解析:模板选择与产品管理实操指南  如何配置支付宝与微信支付功能?  义乌企业网站制作公司,请问义乌比较好的批发小商品的网站是什么?  网站制作培训多少钱一个月,网站优化seo培训课程有哪些?  代刷网站制作软件,别人代刷火车票靠谱吗?  Android自定义控件实现温度旋转按钮效果  网站制作外包价格怎么算,招聘网站上写的“外包”是什么意思?  如何用狗爹虚拟主机快速搭建网站?  如何在云主机快速搭建网站站点?  营销式网站制作方案,销售哪个网站招聘效果最好?  建站之星免费版是否永久可用?  湖南网站制作公司,湖南上善若水科技有限公司做什么的?  Swift开发中switch语句值绑定模式  武汉网站设计制作公司,武汉有哪些比较大的同城网站或论坛,就是里面都是武汉人的?  无锡营销型网站制作公司,无锡网选车牌流程?  高防服务器租用如何选择配置与防御等级?  云南网站制作公司有哪些,云南最好的招聘网站是哪个?  如何设置并定期更换建站之星安全管理员密码?  制作网站公司那家好,网络公司是做什么的?  如何通过IIS搭建网站并配置访问权限?  小说建站VPS选用指南:性能对比、配置优化与建站方案解析  企业网站制作费用多少,企业网站空间一般需要多大,费用是多少? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。