EntityA 是一个聚合根,有许多 EntityB 实体。EntityB 有许多 EntityC 实体。EntityC 正在引用 EntityB(原始父级)和 EntityA(创建 EntityC 时为空)。
有一次,我想将 EntityA 设置为 EntityC 的“新父级”,因此在 EntityC 中,我将对原始 EntityB 父级的引用设置为 null,并将对 EntityA 的引用设置为(之前为 null)。
这种“动态实体父”的想法是否与 DDD 兼容?
EntityA 是一个聚合根,有许多 EntityB 实体。EntityB 有许多 EntityC 实体。EntityC 正在引用 EntityB(原始父级)和 EntityA(创建 EntityC 时为空)。
有一次,我想将 EntityA 设置为 EntityC 的“新父级”,因此在 EntityC 中,我将对原始 EntityB 父级的引用设置为 null,并将对 EntityA 的引用设置为(之前为 null)。
这种“动态实体父”的想法是否与 DDD 兼容?
您的想法绝对与 DDD 兼容。但是,如何实施它很重要。
正如 eulerfx 所指出的,这里的聚合设计是相关的。不过,我确实怀疑您可能有某种形式的分类结构。这意味着该结构的表示可能会成为一组新的实体/聚合。或者,如果不是一个完整的子域,那么可能有实体中的值对象表示的分类。但是,如果您发现自己处于该位置,则在聚合中引用其他聚合有点危险。
设计聚合时的主要考虑因素之一是将其视为一致性边界。所以当你考虑是否应该表达组成实体之间的各种关系时,考虑这些关系是否需要实现行为,以及它们是否需要在执行所述行为后保持一致。DDD 并没有规定对象模型本身的实现,而是规定了对行为和事务一致性的关注。也很多时候,实现关系以支持查询场景。在这些情况下,不要污染聚合,而是创建一个单独的read-model。另外,看看有效的聚合设计。