聚合根通过ID引用另一个聚合根,如何使用RavenDB维护完整性?

时间:2014-03-10 14:58:16

标签: c# domain-driven-design ravendb dddd

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

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

3 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:2)

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

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

答案 2 :(得分:1)

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

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