domain-driven-design - 层次系统中的聚合根与聚合
问题描述
我一直在对 DDD 进行大量研究,并且在聚合与聚合根的概念上遇到了一些问题。
假设我正在尝试对存在于严格层次结构中的太空游戏进行建模,并使用一个Sector
包裹其中包含的所有内容的实体。它可以有一个集合PlanetarySystem
,每个人都可以有一个集合Star
,明星可以有一个集合,Planet
他们自己也可以有一个集合。Moon
我希望所有这些对象都与 that 相关联Sector
,很好地位于层次结构中,但它也可以不与任何扇区相关联。每个项目都可以与它上面的层次结构中的对象具有 0 或 1 关系……如果需要,可以在以太中浮动。我希望能够在Planet
不删除它拥有的所有Moon
实体的情况下删除它,但它可以选择完成。
在这种情况下,我认为这些都应该是它们自己的聚合根,并引用它们包含的聚合根实例,我认为这是错误的吗?还是应该Sector
是实际的聚合根,将所有内容编排为层次结构顶部的对象?
解决方案
聚合根永远不应包含对另一个聚合根的引用。您应该使用 id 来引用关联的聚合或包含 id 和其他一些相关数据的值对象。
任何漂浮在以太中的东西都是聚合根,因为它有自己的生命周期。
我认为就领域而言,层次结构应该以单向方式工作。如果您需要基于更高级别的包含查询较低级别的项目,那么您需要连接或需要将相关的高级标识符/数据非规范化为较低级别的项目。
我的建议是尝试将任何聚合保持在单一级别,但如果这不切实际,那么尝试更深层次的东西,但它很快就会变得笨拙。
推荐阅读
- python - 为什么我无法在数据框 pandas 中舍入一列
- cordova - 如何在 Cordova 中将文件 PDF 从 URL 下载到电话
- docker - Docker 容器内的 IP(不是 PORT!)转发
- cron - 我希望 cron 作业每周运行脚本
- javascript - 是否可以使用 javascript 更改实际的 css 文件?
- css - 更改关键字以在 RMarkdown 文档中突出显示
- python - 如何用 10 个空行填充和合并 df?
- excel - 有什么方法(VBA 中的事件)可以知道何时手动更改选项卡顺序?
- python - 如何使圆圈的运动更顺畅?
- c# - 单向依赖属性的实现