2

假设我有 X 作为聚合根,Y 作为另一个聚合根。使用 NoSql 文档数据库,X 通过 Y 的 Id 保存对 Y 的引用。如果 Y 被删除(独立于 X 的上下文之外),则 X 持有对不存在的 Y 的引用。

在 DDD 中消除或解决此问题的建议解决方案是什么?

4

3 回答 3

2

我不知道 DDD 是否直接解决了您的问题,但建议的“解决方案”可能在于域事件/消息传递。如果相关聚合位于相同的有界上下文中,则域事件可能就足够了,否则您可能需要消息传递基础设施来与另一个有界上下文进行通信。

当您收到“已删除”事件时会发生什么是另一回事,您的领域专家可能会提供帮助。正如@Dmitry S.所暗示的那样,您可能需要将相关的聚合数据非规范化为一个值对象,以便您有足够的信息来保持主要聚合的一致性。在处理“已删除”事件时,您可能希望在主聚合上设置一些指标或以某种方式更新数据以反映删除。

于 2014-03-11T08:05:14.340 回答
2

删除操作应该具有商业意义。例如,仅仅因为某人从库存集合中删除了产品,并不意味着它应该从用户发票中删除。

如果确实需要删除。您始终可以在 RavenDB 中定义索引并更新包含该聚合根 ID 的实体。

于 2014-03-11T05:07:08.717 回答
1

为什么要删除聚合?您可能想要 Expire() 它或 Suspend()。Deactivate()、Disable()、Ban()、Cancel()、Finish() 或 Archive()。但是使用 Delete() 丢失数据会有什么好处呢?

如果你真的需要它(可能是出于法律目的),也许应该创建一些 EvaporaitonService ,它会找到所有相关的聚合并鞭打所有引用。

于 2014-03-10T23:31:37.077 回答