DDD:聚合和实体关系

Dra*_*ake 1 java architecture entities domain-driven-design package

我阅读了一些关于 DDD 的出版物和主题。关于聚合和实体之间的联系,有很多声音。我明白聚合应该尽可能简单(每个聚合一个实体)。但是当聚合具有实体集合时呢?

比方说,我们有一个名为“Month”的聚合,它包含一组“Day”对象(它们是域实体,因为它们需要一个标识来区分——让聚合知道要修改哪个“Day”)。

所以我有两个问题:

  1. 这是一个正确的方法吗?只是正常情况,我不应该担心吗?
  2. 外面的“能见度”怎么样?在我的方法中,聚合是“包私有的”,不允许任何人在系统的不同部分使用它。但是实体呢?它们是否应该像系统不同部分的值对象一样可见?或者只是创建另一个 VO 来表示外部的实体(例如:当实体存储在事件中时)?

谢谢大家的回答

Moh*_*gue 5

将日期和月份建模为实体在很大程度上取决于上下文。这可能不是解释聚合和实体的最佳示例,但让我们尝试一下。

让我们假设在我们的上下文中,一天不能单独存在。它必须在一个月内。如果要引用一天,则必须先指定月份。这就是我们在现实生活中使用日期的方式,1 月 1 日,5 月 8 日……即使这些日子是实体,它们也不需要全局唯一标识符。他们只需要一个月内的标识符 [1 .. 31]。

聚合应该尽可能小,但是每个聚合应该只有一个实体并不是一条规则。您只需要拥有一个在所有系统中具有唯一标识符的聚合根(月)。在聚合中,您可以拥有在聚合中具有唯一标识符的实体(天)[1 .. 31]。如果要引用或访问这些实体,则应始终通过聚合根。