如何在DDD中删除多个聚合?

时间:2017-09-26 13:52:13

标签: domain-driven-design aggregateroot

我在DDD中知道删除聚合根必须一次性删除聚合边界内的所有内容。

但是在agile示例中,vaughn vernon在此处给出https://vaughnvernon.co/?p=838,BackLogItem和Product Aggregates存在于单独的Aggregates中,BackLogItem Aggregate Root通过Id.So引用Product Aggregate Root,如果我想删除Product Aggregate Root并不意味着我应该删除它的BackLogItems?

那么,我的问题是如何删除DDD中的多个聚合,如果可以,那么使用域服务,域事件或其他什么呢?

P.S

  

根据vaughn vernon,我们不应该修改多个   在同一交易中聚合(在某些情况下我们被迫使用   最终的一致性。)

3 个答案:

答案 0 :(得分:1)

跨多个聚合分布的行为的常用机制是使用流程管理器

我建议从Rinat's writeup开始,因为它确实触及了问题的核心;流程管理器只是人类的一个立足点,通过向其他聚合发送命令来对事件做出反应。

  
      
  • 哦,看,产品已被删除
  •   
  • 我应该加载一个引用该产品的BackLogItem列表
  •   
  • 依次删除每一个
  •   

如果您对后备日志项目的建模属于产品中的不同聚合是正确的,那么后面的日志项目的更改可以在时间上与产品的更改分开。

另见Udi Dahan:Don't Delete -- Just Don't

答案 1 :(得分:0)

使用Saga Pattern。它在事务中执行场景并模仿客户的工作。 Saga就像客户端一样发送多个命令。

答案 2 :(得分:0)

我认为您的问题不仅在于如何删除多个聚合,还在于您应该删除哪些聚合。在您的问题中,您提到删除产品汇总时应删除其待办事项,但仅此而已?看板板及其自定义列和工作流程以及与该产品集合相关的N个其他功能呢?

让BacklogItems知道产品而不是相反的目的是避免拥有God对象,该对象对一切都一无所知,因为随着时间的推移,数十种功能可以附加到Product Aggregate。

在删除产品集合时,没有一个地方知道需要删除的所有内容,但是知道需要删除的所有内容。因此,保留删除(或其他方式)其他所有聚合的责任:从ProductAggregate中,发布一个ProductDeletedEvent,然后从所有其他关心它的聚合中进行订阅。