一、聚合
1、聚合的概念:
(1)经过事件风暴,找出实体或值对象,进而将业务关联紧密的实体和值对象进行组合,构成聚合。
(2)聚合就是由业务和逻辑紧密关联的实体和值对象组合而成的,聚合是数据修改和持久化的基本单元,每一个聚合对应一个仓储,实现数据的持久化。
2、聚合有一个聚合根和上下文边界:
(1)一个聚合根:如果把聚合比作组织,那聚合根就是这个组织的负责人。聚合根也称为实体,但它不仅是实体,还是聚合的管理者。在聚合之间,聚合根还是聚合对外的接口人,以聚合根ID关联的方式接受外部任务和请求,在上下文内实现聚合之间的业务协同。(若访问聚合的实体,须先访问聚合根,再导航到聚合内部实体)
(2)上下文边界:根据业务单一职责和高内聚原则,定义了聚合内部应该包含哪些实体和值对象,而聚合之间的边界是松耦合的。(因此其设计出的微服务自然是“高内聚、低耦合”的)
3、聚合的作用:领域模型内的实体和值对象就好比个体,而能让实体和值对象协同工作的组织就是聚合,它用来确保这些领域对象在实现共同的业务逻辑时,能保证数据的一致性。
4、聚合如何实现核心业务逻辑?
跨多个实体的业务逻辑通过领域服务来实现,跨多个聚合的业务逻辑通过应用服务来实现。
二、一个关于如何设计聚合的例子
step 1 :梳理所有实体和值对象,比如这里投保单、标的、客户、被保人
step 2 :确定根实体,也就是聚合根(图中黄色是聚合根)
判断依据:是否有独立的生命周期?是否有全局唯一的ID?是否可以创建或修改其他对象?是否有专门的模块来管这个实体
step 3 :根据业务单一职责和高内聚原则,找出聚合根关联的所有紧密依赖的实体和值对象。构建出1个包含聚合根(唯一)、多个实体和值对象的对象集合,这个集合就是聚合
step 4 :在聚合内根据聚合根、实体和值对象的依赖关系,画出对象的引用和依赖模型。
step 5 :多个聚合根据业务语义和上下文,一起划分到同一个限界上下文内。
三、聚合的一些设计原则
1、在一致性边界内建模真正的不变条件。聚合用来封装真正的不变性,而不是简单的将对象组合在一起。
2、设计小聚合
3、通过唯一标识引用其它聚合
4、在边界之外使用最终一致性 (在一次事务中,最多只能更改一个聚合的状态;如果一次业务操作涉及多个聚合状态的更改,应采用领域事件的方式异步修改相关的聚合,实现聚合之间的解耦)
5、通过应用层实现跨聚合的服务调用
四、聚合、聚合根、实体、值对象的联系和区别: