聚合之间的关联,如何决定是持有对对象的引用还是仅持有其身份

Association between aggregates, how to decide between holding reference to the object or only to its identity

例如,表演有多位表演者...

第一个选项:

Performance (1) ---> (*) Performer

第二个选项:

Performance
+PerformerIds[]

第一个选项优点:

第一个选项缺点:

第二个选项的优缺点与第一个选项明显相反,从性能上更难接触到执行者,模型图更难理解,负载更轻,耦合更少。

我有点喜欢第一个选项,因为 Performance 对象永远不会使用 Performer 对象。该关系更像是数据关系/查询模型。 但在我看来,这也使领域模型图不那么清晰,所以我不确定我是否应该使用哪种解决方案。

我的问题可能是我试图为领域专家和开发人员使用相同的 class 图吗? and/or 主要为查询而非更新建模?

how to decide between holding reference to the object or only to its identity

持有对相关聚合根 (AR) 标识的引用使它们的边界明确。

当然,每个 AR 仍然保留对其所有实体的引用,但是无论您引用聚合根还是实体,它在您的域模型中都变得非常明确。

  • 如果您持有对相关聚合根 (AR) 的引用,则很容易跨越它们之间的边界。
  • 同时更改几个聚合可能非常容易,特别是如果您使用 ORM 或实施了工作单元。所以你的聚合根不再是事务边界。
  • 如果您只持有相关聚合根 (AR) 的标识符,为了访问相关的 AR,您必须先从存储库加载它。这是一个权衡。当您跨越一个聚合的边界并查询另一个聚合时,它变得非常明确。

What I don't like of it is that when you look at a class diagram, all you see is separate aggregates that does not have any association between them, that does not look very useful to show the domain concepts that are related.

您的领域模型是 "model",设计决策由您决定。

如果您所有的聚合根都很小,并且您使用的 ORM 可以免费提供很多魔法(注意:总是有代价的),并且在 class 图表上看到参考的价值大于看到边界的价值,然后尝试持有对相关 AR 的引用,即使您的代码并不真正需要它。

然后一段时间内评估您的模型。