我有一个相当困难的问题要解决。在我的模型中,我有AR Unit
,AR Stage
和VO GoToPositionOrder
,它实现了Order
接口。
它的工作原理是这样的:
- 我创建订单:
order = GoToPositionOrder(Position(Point(3, 4)))
- 给单位:
unit.followOrder(order)
(能给单位下各种命令( - 订单存储在单位中,然后我可以存储单位:
unitRepository.store(unit)
- 存储在单位中的订单每一步都跟着单位,直到订单完成,所以每次发送事件
TimeStep
时,我都会调用域服务unitsFollowOrders(unitRepository.all())
现在,问题出在哪里?每个订单在遵循时对给定的单位(命令模式(执行一些操作:order.execute(unit)
。问题是不同的订单需要不同的附加数据来执行其操作。例如,GoToPositionOrder
需要访问AR Stage
以便找到定位的最短路径。但是我怎样才能Order
访问Stage
?
我不能简单地在那里传递引用,因为出于各种原因,AR 应该由 id 引用。如果它被 id 引用,那么要检索它,VO 将有权访问存储库,这违反了 SRP(单一责任原则(。
我还有哪些其他选择?
我认为域服务是放置路径查找逻辑的正确位置,因为该功能似乎不属于任何实体,是无状态的,并且需要来自多个AR的数据。
它将有一种FindShortestPath()
方法,产生GoToPositionOrder
VO,然后将其注入Unit
。VO 不包含任何逻辑,只包含Unit
实现其目标的步骤列表。