IDDD 10 Aggregate

<< 实现领域驱动设计 >> 十: 聚合

聚合由实体和值对象在一致性边界内组成,却是最不容易理解的。 


Alt text

MindMapping Source (Org Format):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55

* 聚合
** 原则
*** 在一致性边界内建模真正的不变条件
**** 不变的业务规则
**** 事务一致性
**** 一致性边界
*** 设计小聚合
**** 更好性能和伸缩性
**** 根实体
Root Entity
*** 通过唯一标识引用其他聚合
**** 通过标识引用使多个聚合协调工作
**** 建模对象导航性
***** 失联领域模型
(Disconnected Domain Model)
****** 资源库
****** 领域服务
***** 通过应用服务来处理依赖关系
**** 不在同个事务中修改多个聚合实例
*** 在边界之外使用最终一致性
**** 由边界内来控制一致性 — — 事务一致性
**** 由边界外来控制一致性 — — 最终一致性
** 打破原则的理由
有很多因素需要我们做出妥协,但不应该找各种借口来打破原则。
*** 方便用户界面
*** 缺乏技术支持
*** 全局事务
*** 查询性能
** 通过发现,深入理解
*** 重新思考设计
*** 估算聚合成本
*** 常用用例场景
*** 内存消耗
*** 探索另外的设计
*** 实现最终一致性
** 实现
*** 创建具有唯一标识的根实体
将实体建模成聚合根(Aggregate Root)
*** 优先使用值对象
*** 迪米特法则和“告诉非询问”原则
**** Law of Dememter
***** “最小知识”原则
***** 任何对象的任何方法只能调用
****** 自身
****** 传入的参数对象
****** 它所创建的对象
****** 自身包含的其他对象,并且拥有直接访问权
**** Tell, Dont Ask
***** 一个对象不应该被告知该怎么做
*** 乐观并发
**** 为根实体创建版本号
**** 合理控制版本号
*** 避免依赖注入
**** 在聚合内注入 资源库/领域服务 有害,可在应用服务中使用