在具有复杂关联的模型中,很难保证更改对象时的一致性。对象本应维护自身内部状态的一致,但这种一致性可能被其他对象的改变所破坏,这里所说的“其他对象”在概念上是该对象的一部分。另一方面,过于谨慎的数据库加锁方案会导致用户之间毫无意义地相互干扰,从而可能使系统无法使用。在将对象分布到多个服务器,或设计异步事务时,也会出现类似的问题。
因此:
将实体和值对象组成体,并在其周围定义边界。在每个聚合体中,选择一个实体作为聚合根,并且只允许外部对象持有对根的引用(只有在单个操作中,才允许将对内部成员的引用传递出去)。将聚合体作为一个整体,定义其性质和不变式,并将维护这些约束的职责交给聚合根或某些指定的框架机制。
使用相同的聚合体边界来管理事务和对象的分布。
在聚合体边界内,同步地应用一致性规则。跨越边界时,则异步地处理更新。
将一个聚合体放在同一台服务器上。允许不同的聚合体分布到不同的节点上。
当根据聚合体边界不能很好地实现这些设计决策时,就要对模型进行重新考虑了。导致这一状况的场景是否可以使我们更深刻地理解领域知识?这一理解所导致的更改通常会改进模型的表现力和灵活性,并解决事务和分布式系统方面的问题。