如何明确聚合边界是最大的问题,聚合的数量是多少,我们是否应该将所有实体归属于一个聚合?聚合的划分取决于领域模型。即时实体是完全相同的,它们不同领域下的聚合也可能是不同的。

    • 内部实体紧耦合
    • 不同聚合间的实体松耦合

    在边界区分上,我们可以遵循几个要点,同一聚合内的实体紧耦合,不同聚合间的实体松耦合,当聚合内的某个实体和其它实体关联性不高时,或者可以脱离其它实体单独存在时,可以考虑将其转换为聚合根。

    • SnackMachine+Slot = Aggregate 1
    • Snack = Aggregate 2

    Slot实体显然不能离开SnackMachine单独存在,所以它是聚合的一部分。而Snack可以作为聚合根独立存在。

    • 界限发生改变时,毫不犹豫地变更

    当你发现目前地边界已经不能很好地划分、处理问题时,即时重构。领域建模是一个迭代的过程。不要期望一开始就能将界限完美定义。

    • 聚合不能过于臃肿

    SnackMachine的构成可以采用另一种方式,比如将Snack直接聚合在其中。这种方式看起来削减了聚合数量,简化了领域模型。这种方式反而会给维护带来灾难,聚合减少意味着单个聚合的臃肿庞大,聚合越大,其一致性就越难维护。边界划分是个难题,其本质是简单性和性能的权衡。

    • 聚合通常由1至两个实体组成
    • 最多3个实体
    • 值对象的数量是没有限制的

    大多数的聚合包含一至两个实体,在我印象中,超过三个实体的聚合不存在。界限的这些划分规则只使用与实体,对值对象没有限制。
    image.png
    注意,实体中的一对多关系更像是一对一些关系,多的部分数量不应太多。如果领域模型包含超过30个实体成员的集合,那么就需要考虑重构,将实体扩展为聚合。例如我们可以将售货机的购买过程保存在其中的一个集合,这种方式看起来不错,但随着记录的增加,维护成本急剧上升。更好的方式是将其扩展为另一个聚合,为了将这两者协同,需要引入领域事件。领域事件将在之后的章节中介绍。