首页 > 解决方案 > 层次系统中的聚合根与聚合

问题描述

我一直在对 DDD 进行大量研究,并且在聚合与聚合根的概念上遇到了一些问题。

假设我正在尝试对存在于严格层次结构中的太空游戏进行建模,并使用一个Sector包裹其中包含的所有内容的实体。它可以有一个集合PlanetarySystem,每个人都可以有一个集合Star,明星可以有一个集合,Planet他们自己也可以有一个集合。Moon

我希望所有这些对象都与 that 相关联Sector,很好地位于层次结构中,但它也可以不与任何扇区相关联。每个项目都可以与它上面的层次结构中的对象具有 0 或 1 关系……如果需要,可以在以太中浮动。我希望能够在Planet不删除它拥有的所有Moon实体的情况下删除它,但它可以选择完成。

在这种情况下,我认为这些都应该是它们自己的聚合根,并引用它们包含的聚合根实例,我认为这是错误的吗?还是应该Sector是实际的聚合根,将所有内容编排为层次结构顶部的对象?

标签: domain-driven-designaggregateroot

解决方案


聚合根永远不应包含对另一个聚合根的引用。您应该使用 id 来引用关联的聚合或包含 id 和其他一些相关数据的值对象。

任何漂浮在以太中的东西都是聚合根,因为它有自己的生命周期。

我认为就领域而言,层次结构应该以单向方式工作。如果您需要基于更高级别的包含查询较低级别的项目,那么您需要连接或需要将相关的高级标识符/数据非规范化为较低级别的项目。

我的建议是尝试将任何聚合保持在单一级别,但如果这不切实际,那么尝试更深层次的东西,但它很快就会变得笨拙。


推荐阅读