使用CQRS DDD在事件之后循环命令

时间:2019-09-12 13:56:28

标签: domain-driven-design cqrs

让我们说我要在删除邻居时删除邻居的所有房屋(实际上是在举一个随机的例子)。我想知道的是,在事件之后链接一组命令的最佳实践是什么:

1)

  • DeleteNeighborhoodCommand是从任何入口点调度的
  • DeleteNeighborhoodCommandHandler被触发,删除邻居并调度NeighborhoodDeletedEvent
  • DelteHousesWhenNeighboorDeletedEventListener被触发,查询相关邻里的所有房屋并逐一分发DeleteHouseCommand
  • DeleteHouseCommandHandler被多次触发,删除房屋并发送HouseDeleted事件

2)

  • DeleteNeighborhoodCommand是从任何入口点调度的
  • DeleteNeighborhoodCommandHandler被触发,删除邻居,删除每个房屋并调度NeighborhoodDeletedEvent和X次HouseDeleted

值得注意的是,我们处于相同的有界上下文中,并且正在处理同一域中的聚合。

2 个答案:

答案 0 :(得分:1)

我认为选项1是一个更好的选择,仅仅是因为您在NeighborhoodDeletedEvent上触发了简单的脱节操作。

在选项2中,您将硬链接其中一个动作(删除房屋),并引发不一定指示刚刚执行的命令的事件(DeleteNeighborhoodCommand)。

即使在相同的受限上下文中并且在同一域中处理聚合,IMHO保持事物异步和基于事件的方式从长远来看也可以帮助您,因为它鼓励明确划分责任。没有一个命令承担的任务超过了它应该处理的范围。

答案 1 :(得分:0)

好吧,这完全取决于您的模型。

删除邻居后是否需要删除所有房屋?强制性?您是否将邻居用作某些特定域过程的分组?换句话说,房屋(不变式)必须具有邻里关系吗?

我在想,也许您的房屋不需要成为AR,而是生活在邻居AR中的实体的集合。

您会发现,DDD与MODELING有关,而与其周围的基础架构无关。一旦按照自己的方式进行建模,其他部分就会有机地融合在一起。

让我们说它们是两个单独的AR,我将发出事件NeighborhoodDeleted,然后在事件处理程序中,我将简单地获取该邻域的所有房屋并将其从回购协议中删除。这样一来,您无需仅因为您的邻里拥有200所房屋就可以发出200条命令。

但同样,您需要正确建模域。您永远不会一开始就把它弄对,所以,不要过分强调。只是不断发展。