当我们只从 URL 参数中获取它们的身份时,我一直在寻找正确的方法来引用位于聚合根中的实体。我问了一个先前的问题,该问题最终集中在value objects上,所以我从这里的另一个示例开始。
假设我们要修改 anOrderLine
内部Order
:
- 用户转到一个页面,他可以在其中看到订单摘要及其所有订单行。
- 用户单击订单行旁边的编辑按钮。
- 他被引导到
edit-order-line?orderId=x&orderLineId=y
现在,如果我需要更新 OrderLine 中的数量,我可以这样做:
Order order = orderRepository.find(orderId);
order.updateQuantity(orderLineId, 2);
但是,我对将责任留给教团通过 Id 检索其自身的部分的想法感到不太自在。我对这个主题的看法是,在领域内,我们应该只与对象交谈,而不是与 Ids 交谈。ID 不是通用语言的一部分,我相信它们应该存在于域之外,例如在控制器中。
我会对以下内容更有信心:
Order order = orderRepository.find(orderId);
OrderLine orderLine = em.find(OrderLine.class, orderLineId);
order.updateQuantity(orderLine, 2);
虽然我也不喜欢直接与实体管理器交互的想法。我觉得我正在绕过 Repository 和 Aggregate Root 职责(因为我可以直接与 OrderLine 交互)。
你如何解决这个问题?