聚合
聚合Aggregate就是一组相关对象的集合,我们把它作为数据修改和访问的单元。一个聚合包含聚合根、实体和值对象。
每个聚合都会有一个聚合根和聚合的边界Boundary,边界定义了在一个聚合里面内部应该有哪些实体,哪些子实体对象。定义边界的原因是我们期望对一个聚合的访问是通过聚合根点进行的,聚合里面的子实体对外界是完全封闭的。对于外部对象不应该去访问到一个聚合边界里面的子实体。
按实际对象分析思路,在领域模型中的领域对象分析应该按照从顶向下的思路进行展开,如果这样的话首先识别到的就是聚合根对象,然后再考虑对聚合根对象进行展开,在聚合根对象的展开过程中进一步细化子实体之间的关联和依赖关系。
实体、聚合根和值对象
实体有ID标识,有生命周期,有状态(用值对象来描述状态),实体通过ID进行区分。
聚合根是实体,聚合根的ID全局唯一标识。聚合根下面的实体的ID在聚合根内唯一即可。
聚合根相当于主Entity,子实体都不可能孤立存在,它们必须依附于一个聚合根存在。
值对象的核心本质是值,与是否有复杂类型无关,值对象没有生命周期,通过两个值对象的值是否相同区分是否是同一个值对象,值对象主要用于描述实体的状态。
- 实体
具有唯一标识
持久化
具有生命周期
通过ID判断相等性
可变
- 值对象
无唯一标识
用完就丢,主要起描述性作用
通过属性判断相等性,实现Equals方法
不可变
聚合设计的原则
- 聚合是用来封装真正的不变性,而不是简单的将对象组合在一起
- 聚合应尽量设计的小,主要因为业务决定聚合,业务改变聚合,尽可能小的拆分,可以避免重构,重新拆分
- 聚合之间的关联通过ID,而不是对象引用
- 聚合内强一致性,聚合之间最终一致性(高内聚低耦合)。边界就是界限上下文。
链接
领域模型:聚合、聚合根详解
领域模型核心概念:实体、值对象和聚合根
领域驱动设计: 构建你的代码蓝图
Domain-driven Design - Overview and building blocks