我有一个聚合根,这是一个挑选和打包订单的计划。它将被分配一个海湾,该海湾必须是空的。
我要创建一个名为AllocateToBay的命令,它将指示应该使用哪个托架。但是,如何从订单内部验证海湾实际上是空的?
我认为我需要的是海湾聚合根,我需要让海湾分配给订单。然后它可以提出一个事件,说它被分配给一个订单。然后我会有一个传奇,也许会听这个事件,然后向命令发出命令让它知道它分配了哪个海湾。但我并不觉得海湾应该是一个聚合根。
或者我可以“信任”#34;该命令,并有一些监视事件以检测重复分配的东西,它可以发出命令来纠正任何重复的分配(我猜这仍然是一个传奇)?这样,海湾至少不必是聚合根。
这一切看起来有点长,但我想不出更好的方法吗?
答案 0 :(得分:0)
如果聚合根需要从其自己的边界外部查找数据,通常的答案是传入支持查询的服务提供者(即域服务)。
然而,我并不觉得海湾应该是一个聚合根。
海湾是现实世界中的一件事,对吗?然后它不是一个聚合根,因为现实世界,而不是你的模型,控制着"状态"海湾。
或者我可以“信任”#34;该命令,并有一些监视事件以检测重复分配的东西,它可以发出命令来纠正任何重复的分配
鉴于您正在处理针对不受您的域模型控制的州的验证,您的模型将始终存在基于有关Bay状态的陈旧且不准确的信息做出决策的风险。因此,检测潜在冲突(记住,您的探测器也在处理陈旧数据)并且升级可能会很重要。
那就是说,你的模型应该只分配给它认为可用的海湾,这是合理的;特别是如果模型更有可能获得更新的信息,或者如果选择bay应该是聚合状态的一部分。
当聚合模型表明托架被占用时,您是否希望操作人员能够坚持将聚合工作分配到托架?此用例可能决定聚合是检查还是信任该命令。
你认为正在观看许多不同的事件,检查冲突,可能是一个过程管理器"而不是一个传奇(这是一个在长期运行的事务中使用的更复杂的事情;有一个很多写在那里混淆了两个术语)。