假设我将X作为聚合根,并将Y作为另一个聚合根。 使用NoSql文档数据库,X通过Y的Id保存对Y的引用。如果Y被删除(独立于X的上下文之外),则X持有对不存在的Y的引用。
在DDD中消除或解决此问题的建议解决方案是什么?
答案 0 :(得分:2)
删除操作应该具有商业意义。例如,仅仅因为有人从库存集合中删除了产品,并不意味着应该从用户发票中删除它。
如果确实需要删除。您始终可以在RavenDB中定义索引并更新包含该聚合根ID的实体。
答案 1 :(得分:2)
我不知道DDD是否直接谈到您的问题,但建议的“解决方案”可能在于域事件/消息传递。如果相关聚合在相同的有界上下文中,则域事件可能就足够了,您可能需要消息传递基础结构来与另一个有界上下文进行通信。
当您收到“已删除”活动时会发生什么是另一个故事,您的域名专家可能会提供帮助。正如@Dmitry S.所提到的,您可能需要将相关的聚合数据反规范化为值对象,以便您有足够的信息来保持主聚合的一致性。处理“已删除”事件时,您可能需要在主聚合上设置一些指标,或以某种方式更新数据以反映删除。
答案 2 :(得分:1)
为什么要删除聚合?您可能想要Expire()它或Suspend()。 Deactivate(),Disable(),Ban(),Cancel(),Finish()或Archive()。但是,使用Delete()丢失数据会带来什么好处?
如果您真的需要(可能是出于法律目的),可能应该创建一些EvaporaitonService,它会找到所有相关的聚合并且消除所有引用。