Domain driven design DDD:聚合根引用属于另一个聚合根的子实体

Domain driven design DDD:聚合根引用属于另一个聚合根的子实体,domain-driven-design,Domain Driven Design,这是我试图解决的问题。我有个客户。该客户端需要软件来管理事件 客户端有多个设施。每个设施包含多个位置 当他们记录一个事件时,他们需要记录的最低信息是事件发生的地点,以及事件发生地点和发生情况的设施 所以我有一些问题是在模拟这个问题。这就是我所拥有的 我的问题是: 我认为这是一个很好的设计。设施根目录在我看来是有意义的,因为位置不能独立存在。但事件现在软引用了设施和位置 我考虑将位置作为一个值对象,而不是实体。I此案例事件将有其自己的位置副本。但如果位置发生变异,这将成为一个问题 有什么想法吗?

这是我试图解决的问题。我有个客户。该客户端需要软件来管理事件

客户端有多个设施。每个设施包含多个位置

当他们记录一个事件时,他们需要记录的最低信息是事件发生的地点,以及事件发生地点和发生情况的设施

所以我有一些问题是在模拟这个问题。这就是我所拥有的

我的问题是: 我认为这是一个很好的设计。设施根目录在我看来是有意义的,因为位置不能独立存在。但事件现在软引用了设施位置

我考虑将位置作为一个值对象,而不是实体。I此案例事件将有其自己的位置副本。但如果位置发生变异,这将成为一个问题


有什么想法吗?提前谢谢。也许我错过了什么。仅作记录-事件,因为它们包含工作流等,变得非常复杂,是核心领域。也许只有事件应该用DDD解决?

如果位置发生变化,您确定要将这些变化传播到事件的位置吗?我想改变它的唯一原因是修正打字错误,但这是一个你需要问的问题

在任何情况下,您都可以引用复合ID,我最愿意将其表示为
IncidentLocation
value对象。该规则仅声明您不能对子实体进行对象引用,并且您不能仅引用子实体的ID,因为它只能保证在其根中是唯一的


请注意,这里至少有两个上下文可能是个好主意。一个基于CRUD的上下文,其中将管理设施和此类详细信息,一个事件日志上下文,其中可以管理事件的生命周期。在这种情况下,
Location
可以是第一个上下文中的一个实体,也可以是第二个上下文中的一个不可变值对象
Location{facilityId,locationId}

那么,如果位置发生更改,您确定要将更改传播到事件的位置吗?我想改变它的唯一原因是修正打字错误,但这是一个你需要问的问题

在任何情况下,您都可以引用复合ID,我最愿意将其表示为
IncidentLocation
value对象。该规则仅声明您不能对子实体进行对象引用,并且您不能仅引用子实体的ID,因为它只能保证在其根中是唯一的


请注意,这里至少有两个上下文可能是个好主意。一个基于CRUD的上下文,其中将管理设施和此类详细信息,一个事件日志上下文,其中可以管理事件的生命周期。在这种情况下,
Location
可以是第一个上下文中的实体,也可以是第二个上下文中的不可变值对象
Location{facilityId,locationId}

@MegaByte:位置将如何变异是一个重要问题。考虑一个<代码>命令>代码>一个<代码> LITENTION/CONT>,引用了一个<代码>产品> <代码>,客户订购了5个“红笔”。然而,有人发现这些钢笔实际上是蓝色的,于是将描述改为“蓝色钢笔”。这完全改变了顺序。这将导致相当多的混乱。同样的情况也会发生在你的位置改变的时候。输入错误是可以的,但可能会发生一些重大变化,从而导致
事件
受到一些负面影响。感谢您的回复。我喜欢IncidentLocation值对象/复合id方法。在我的例子中,locationId是引擎盖下的guid,因此它应该是唯一的。将facilityId作为复合密钥的一部分仍然是一个好主意/做法吗?@MegaByte好吧,首先为嵌套实体提供一个全局唯一标识符没有多大意义。这似乎相当低效?不添加facilityId的危险在于,您的模型依赖于子实体ID始终唯一的保证,而这不是常见DDD建模规则的限制。如果必须从域中查找子实体,它也会感觉不那么自然(例如findFacilityByLocation(locationId))。@MegaByte:位置将如何变化是一个重要的问题。考虑一个<代码>命令>代码>一个<代码> LITENTION/CONT>,引用了一个<代码>产品> <代码>,客户订购了5个“红笔”。然而,有人发现这些钢笔实际上是蓝色的,于是将描述改为“蓝色钢笔”。这完全改变了顺序。这将导致相当多的混乱。同样的情况也会发生在你的位置改变的时候。输入错误是可以的,但可能会发生一些重大变化,从而导致
事件
受到一些负面影响。感谢您的回复。我喜欢IncidentLocation值对象/复合id方法。在我的例子中,locationId是引擎盖下的guid,因此它应该是唯一的。将facilityId作为复合密钥的一部分仍然是一个好主意/做法吗?@MegaByte好吧,首先为嵌套实体提供一个全局唯一标识符没有多大意义。这似乎相当低效?不添加facilityId的危险在于,您的模型依赖于子实体ID始终唯一的保证,而这不是常见DDD建模规则的限制。如果必须查找子实体