让我们说我要在删除邻居时删除邻居的所有房屋(实际上是在举一个随机的例子)。我想知道的是,在事件之后链接一组命令的最佳实践是什么:
1)
DeleteNeighborhoodCommand
是从任何入口点调度的DeleteNeighborhoodCommandHandler
被触发,删除邻居并调度NeighborhoodDeletedEvent
DelteHousesWhenNeighboorDeletedEventListener
被触发,查询相关邻里的所有房屋并逐一分发DeleteHouseCommand
。DeleteHouseCommandHandler
被多次触发,删除房屋并发送HouseDeleted
事件2)
DeleteNeighborhoodCommand
是从任何入口点调度的DeleteNeighborhoodCommandHandler
被触发,删除邻居,删除每个房屋并调度NeighborhoodDeletedEvent
和X次HouseDeleted
值得注意的是,我们处于相同的有界上下文中,并且正在处理同一域中的聚合。
答案 0 :(得分:1)
我认为选项1是一个更好的选择,仅仅是因为您在NeighborhoodDeletedEvent
上触发了简单的脱节操作。
在选项2中,您将硬链接其中一个动作(删除房屋),并引发不一定指示刚刚执行的命令的事件(DeleteNeighborhoodCommand
)。
即使在相同的受限上下文中并且在同一域中处理聚合,IMHO保持事物异步和基于事件的方式从长远来看也可以帮助您,因为它鼓励明确划分责任。没有一个命令承担的任务超过了它应该处理的范围。
答案 1 :(得分:0)
好吧,这完全取决于您的模型。
删除邻居后是否需要删除所有房屋?强制性?您是否将邻居用作某些特定域过程的分组?换句话说,房屋(不变式)必须具有邻里关系吗?
我在想,也许您的房屋不需要成为AR,而是生活在邻居AR中的实体的集合。
您会发现,DDD与MODELING有关,而与其周围的基础架构无关。一旦按照自己的方式进行建模,其他部分就会有机地融合在一起。
让我们说它们是两个单独的AR,我将发出事件NeighborhoodDeleted
,然后在事件处理程序中,我将简单地获取该邻域的所有房屋并将其从回购协议中删除。这样一来,您无需仅因为您的邻里拥有200所房屋就可以发出200条命令。
但同样,您需要正确建模域。您永远不会一开始就把它弄对,所以,不要过分强调。只是不断发展。