战术模式

战术模式围绕 7 个章专属概念,以边界模型、决策轨迹、违规恢复和来源分层完成验收。

学习目标

  • 能解释“战术模式”如何在单一限界上下文内,用身份、属性值、无状态操作、一致性边界与重建机制表达模型
  • 能逐项定位 实体、值对象、领域服务、聚合、工厂、仓储、领域事件,并说明每个概念在当前来源边界内承担什么责任
  • 能按 识别身份 → 写出不变量 → 确定聚合根 → 完成合法创建 → 保存并发布事实 推演“订单加商品”,检查“聚合边界内的不变量在一次业务操作后成立,外部只通过聚合根引用内部对象”
  • 能注入“把实体、值对象、服务、仓储逐一对应到数据库表、DTO 和通用 CRUD 类”,依据对象身份合同、值相等测试、聚合命令、事务边界、工厂后置条件、仓储接口与领域事件定位越界、撤销并用同一情境重放

为什么从“先写出业务身份与不变量,再选择最少的战术模式支撑它们;数据存储形状不能反向决定领域对象职责”开始

在单一限界上下文内,用身份、属性值、无状态操作、一致性边界与重建机制表达模型。本页先画责任和依赖,再沿具体情境执行决策,最后主动制造一个边界违规;这种顺序把术语变成可以验证、推翻和恢复的设计合同。

“战术模式”不是技术采购建议。它处理的是规则放在哪里、模型在哪个语境内成立、哪些变化可以被隔离,以及团队如何判断一条边界已经被穿透。最终功能可运行,只能证明快乐路径存在,不能证明结构允许安全演进。

来源、版次与课程边界

战术模式定义以 Evans 官方 DDD Reference 公开摘要为准;示例只用于展示模式协作,不主张存在一个适合所有领域的固定代码骨架。

本专题不是某一本既有书的中文版,也不是把多位作者的文章拼成“原著章节”。课程主干分别取自 Eric Evans 的领域驱动设计体系与 Robert C. Martin 的整洁架构体系;CQRS、事件溯源和六边形架构始终标为扩展。以下链接承担不同事实责任:

本页采用独立中文重写。能从公开全文或授权摘要核对的定义才作为来源事实;项目情境、交互实验、取舍表和练习答案均为本站教学设计。

核心概念与可观察责任

实体

实体由连续身份而不是当前属性定义;属性会变,系统仍须知道前后是同一个领域对象并维护其生命周期。 在“订单加商品”中,观察重点是聚合边界内的不变量在一次业务操作后成立,外部只通过聚合根引用内部对象。

值对象

值对象由描述性属性整体定义,没有业务身份,通常保持不可变;相等判断比较值,替换整个对象比修改局部更清晰。 在“修改地址”中,观察重点是对象身份合同、值相等测试、聚合命令、事务边界、工厂后置条件、仓储接口与领域事件。

领域服务

当重要领域操作不自然属于某个实体或值对象时,用无状态服务表达;它的名称和参数仍必须来自通用语言。 在“订单加商品”中,观察重点是聚合边界内的不变量在一次业务操作后成立,外部只通过聚合根引用内部对象。

聚合

聚合划定一致性边界并指定根,外部通过根发出命令;边界应由必须同步成立的不变量决定,而非对象图大小。 在“修改地址”中,观察重点是对象身份合同、值相等测试、聚合命令、事务边界、工厂后置条件、仓储接口与领域事件。

工厂

工厂封装复杂创建过程,交付满足不变量的完整对象;调用者表达创建意图,无需知道内部装配细节。 在“订单加商品”中,观察重点是聚合边界内的不变量在一次业务操作后成立,外部只通过聚合根引用内部对象。

仓储

仓储提供面向领域的聚合获取与保存抽象,使持久化看起来像集合操作;接口不应泄漏查询引擎细节。 在“修改地址”中,观察重点是对象身份合同、值相等测试、聚合命令、事务边界、工厂后置条件、仓储接口与领域事件。

领域事件

领域事件记录模型内已经发生且对业务有意义的事实,可驱动同一上下文或边界外的后续反应。 在“订单加商品”中,观察重点是聚合边界内的不变量在一次业务操作后成立,外部只通过聚合根引用内部对象。

一条可执行的设计判断

本页采用以下判断链:先写出业务身份与不变量,再选择最少的战术模式支撑它们;数据存储形状不能反向决定领域对象职责。正常情况下必须持续保持“聚合边界内的不变量在一次业务操作后成立,外部只通过聚合根引用内部对象”;反例“把实体、值对象、服务、仓储逐一对应到数据库表、DTO 和通用 CRUD 类”只改变一个关键条件,便于定位因果。

观察项本页合同
最小正常情境新增一项后总额和促销资格必须同步更新
边界或迁移情境收货地址由街道、城市和邮编共同描述
必须保持聚合边界内的不变量在一次业务操作后成立,外部只通过聚合根引用内部对象
首要违规把实体、值对象、服务、仓储逐一对应到数据库表、DTO 和通用 CRUD 类
验收证据对象身份合同、值相等测试、聚合命令、事务边界、工厂后置条件、仓储接口与领域事件

先预测,再操作三个本页实验

分步1 / 3

实验一:边界与模型地图

操作前先预测“订单加商品”里哪一侧拥有规则、哪一侧只是技术或协作细节。切换概念和情境后,检查“先写出业务身份与不变量,再选择最少的战术模式支撑它们;数据存储形状不能反向决定领域对象职责”是否仍能解释三块区域的责任。

Boundary model

战术模式:边界与责任地图

在单一限界上下文内,用身份、属性值、无状态操作、一致性边界与重建机制表达模型

切换最小情境

定位正式概念

architecturedomaindesign-08 · 当前观察

实体新增一项后总额和促销资格必须同步更新

区域 1身份与值

实体保持连续身份,值对象表达属性组合

区域 2一致性边界

聚合根执行命令并保护不变量

区域 3创建与存取

工厂、仓储和事件连接生命周期

情境验收

通过订单聚合根执行命令,一次操作后所有聚合内不变量成立

易错边界与取舍

练习与答案

练习

问题 1:概念—边界—证据对照。 完成以下逐项核对:

  1. 实体:写出它所在的边界、允许的依赖方向、一个最小反例和一份可观察证据。
  2. 值对象:写出它所在的边界、允许的依赖方向、一个最小反例和一份可观察证据。
  3. 领域服务:写出它所在的边界、允许的依赖方向、一个最小反例和一份可观察证据。
  4. 聚合:写出它所在的边界、允许的依赖方向、一个最小反例和一份可观察证据。
  5. 工厂:写出它所在的边界、允许的依赖方向、一个最小反例和一份可观察证据。
  6. 仓储:写出它所在的边界、允许的依赖方向、一个最小反例和一份可观察证据。
  7. 领域事件:写出它所在的边界、允许的依赖方向、一个最小反例和一份可观察证据。

问题 2:最小情境推演。 怎样验证“订单加商品”没有靠最终功能碰巧通过?

问题 3:替代方案与恢复。 注入“把实体、值对象、服务、仓储逐一对应到数据库表、DTO 和通用 CRUD 类”后,怎样比较修复与更简单方案?

本页小结

  • 战术模式的核心判断是:先写出业务身份与不变量,再选择最少的战术模式支撑它们;数据存储形状不能反向决定领域对象职责。
  • 正常路径以“通过订单聚合根执行命令,一次操作后所有聚合内不变量成立”验收,不能只检查接口返回成功。
  • 边界路径以“以新的地址值对象整体替换,值相等不依赖数据库主键”验收,并保存对象身份合同、值相等测试、聚合命令、事务边界、工厂后置条件、仓储接口与领域事件。
  • 如果“把实体、值对象、服务、仓储逐一对应到数据库表、DTO 和通用 CRUD 类”仍可静默通过,说明边界只是图示,没有成为可执行约束。

资料与写作方式声明

本章以架构与领域设计:DDD、Clean Architecture 与明确标注的扩展资料合法公开试读核定可见范围,并以目录限定未公开部分,并结合正文列出的技术资料独立重写;不宣称复现原书正文,也不沿用原作表述。

原作版权归作者与出版社所有;本站原创教学结构与表述仅供学习交流。

讨论

评论区加载中…