一组相关对象的集合,我们把它作为数据修改的单元。每个聚合都有一个根(root)和一个边界(boundary)。边界定义了聚合内部都有什么,根则是聚合内部所包含的一个特定实体(ENTITY)。对聚合而言,外部对象只可以引用根,而边界内部的对象之间则可以相互引用。除根以外的其他ENTITY都有本地标识,但这些标志只在聚合内部才需要加以区别,因为外部对象除了根ENTITY之外看不到其他对象。
固定规则(invariant)是指数据变化时必须保持的一致性规则,其涉及聚合成员之间的内部关系。而任何跨越聚合的规则将不要求每时每刻都保持最新状态。通过事件处理、批处理或其他更新机制,这些依赖会在一定的时间内得以解决。但在每个事务完成时,聚合内部所应用的固定规则必须得到满足。
为了实现聚合,我们给所有事务应用一组规则:
1.根具有全局标识,它最终负责检查固定规则。
2.边界内的ENTITY具有本地标识,这些标志只在聚合内部才是唯一的。
3.聚合外部的对象不能引用除根之外的任何内部对象。根可以把对内部实体的引用传递给它们,但这些对象只能临时使用这些引用,而不能保持引用。根可以把一个值对象的副本传递给另一个对象,而不必关心它发生了什么变化,因为它只是一个值,不再与聚合有任何关联。
4.只有聚合的根才能直接通过数据库查询获取,所有其他对象必须通过遍历关联来发现。
5.聚合内部的对象可以保持对其他聚合根的引用
6.删除操作必须一次删除聚合边界之内的所有对象
7.当提交对聚合边界内部的任何对象的修改时,整个聚合的所有固定规则都必须满足。