DDD:聚合根引用子实体,该子实体属于另一个聚合根

时间:2019-01-25 21:05:35

标签: domain-driven-design

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

客户具有多个设施。每个 FACILITY 都包含多个 LOCATIONS

当他们记录 INCIDENT 时,他们需要记录的最少信息是发生位置的 LOCATION FACILITY 位置发生的地方和发生的事情。

所以我有问题要对这个问题进行建模。这就是我所拥有的。

enter image description here

这是我的问题: 我这个设计很好。使用 FACILITY 根是合理的,因为 LOCATION 不能单独存在。但是,突发事件现在对 FACILITY LOCATION 都具有软引用。

我考虑将 LOCATION 设为值对象,而不是实体。在这种情况下, INCIDENT 将拥有其自己的 LOCATION 副本。但是,如果 LOCATION 发生突变,这将成为一个问题。

有什么想法吗?提前致谢。也许我缺少了一些东西。仅作记录-突发事件因为它们包含工作流程等,因此变得非常复杂,并且是核心领域。也许只有 INCIDENT 应该用DDD解决?

1 个答案:

答案 0 :(得分:2)

那么,如果您确定位置发生了变化,您是否还希望这些变化也传播到事件的位置?我想改变它的唯一原因是修正错别字,但这是您需要提出的问题。

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

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