聚合根:聚合之间通过聚合根关联引用,如果需要访问其他聚合的实体,先访问聚合根,再导航到聚合内部的实体;即外部对象不能直接访问聚合内的实体,具备唯一标识有独立的声明周期,一个聚合只能有一个聚合根
解决的问题: 复杂数据模型缺少统一的业务规则控制而导致的聚合,实体之间数据不一致的问题
职责:
1,作为实体,具备自己的业务属性,业务行为,业务逻辑
2,作为聚合的管理者
在聚合内部,负责协调实体和值对象按照固定的业务规则协同完成共同的业务逻辑;
在聚合之间:它是聚合对外的接口人,以聚合根ID的方式接受外部请求和任务,实现上下文中的聚合之间的业务协同;
设计原则:
聚合设计的尽量小 如果聚合设计的过大,内部还有大量的实体和值对象,管理会比较复杂,高频操作会有并发和数据库锁冲突的问题,导致系统可用性降低; 聚合设计的足够小,也就降低了复杂度,可复用性也更高,降低了后期重构复杂聚合的成本;
聚合应该高内聚 封装的是真正的不变的领域对象,内部的实体和值对象按照固定的规则运行,实现数据的一致性,边界外的任何东西都于该聚合无关,
通过唯一标识符引用其它聚合 聚合之间通过聚合根的唯一ID来关联,而不是直接对象引用的方式,外部的聚合对象如果在本聚合范围内管理,容易导致边界不清晰,增加聚合之间的耦合度;
边界之外使用最终一致性 聚合内部数据强一致性,聚合之间数据最终一致性,在一次事务中最多只修改一个聚合的数据状态,如果在一次事务中涉及修改多个聚合的状态,应该使用领域事件的方式来异步的实现最终一致性,实现聚合之间的解耦;
在应用层实现跨聚合的调用 实现微服务内部聚合之间的解耦,以为为未来以聚合为单位的拆分和组合,应该避免跨聚合的的领域服务调用和数据表关联;