从值对象访问AR

时间:2014-10-16 08:26:33

标签: domain-driven-design aggregateroot value-objects

我有一个很难解决的问题。 在我的模型中,我有AR UnitAR StageVO GoToPositionOrder,它们实现了Order接口。

它的工作原理如下:

  • 我创建了订单:order = GoToPositionOrder(Position(Point(3, 4)))
  • 我将它交给单位:unit.followOrder(order)(我可以向单位发出各种命令)
  • 订单存储在Unit中,然后我可以存储单位:unitRepository.store(unit)
  • 存储在单元中的订单每个步骤都跟着单元,直到订单完成,因此每次发送事件TimeStep时,我都会调用域服务unitsFollowOrders(unitRepository.all())

现在,问题出在哪里?遵循时,每个订单对给定单位(命令模式)执行一些操作:order.execute(unit)。问题是不同的订单需要不同的附加数据来执行其操作。例如,GoToPositionOrder需要访问AR Stage,以便找到最短的定位路径。但是,我如何才能Order Stage访问{{1}}?

我不能简单地在那里传递引用,因为AR应该由id引用,原因有多种。如果它被id引用,那么要检索它,VO将有权访问存储库,这违反了SRP(单一责任原则)。

我还有其他选择吗?

1 个答案:

答案 0 :(得分:0)

我认为域服务是放置寻路逻辑的正确位置,因为该功能似乎不属于任何实体,是无状态的,并且需要来自多个AR的数据。

它会产生一个FindShortestPath()方法产生GoToPositionOrder VO,然后将其注入Unit。 VO不包含逻辑,只包含Unit达到目标的步骤列表。