我坚持寻找适当的参考方法 实体 位于An 聚集根, ,当我们只得到他们 身份 来自URL参数。我问一个 上一个问题 最终专注于 值对象, ,所以我从这里从另一个示例开始。

假设我们要修改 OrderLine 内部 Order:

  • 用户转到一个页面,他可以在其中看到订单摘要及其所有订单行。
  • 用户点击 编辑 按钮在订单行旁边。
  • 他被指向 edit-order-line?orderId=x&orderLineId=y

现在,如果我需要更新订单线中的数量,我可以做:

Order order = orderRepository.find(orderId);
order.updateQuantity(orderLineId, 2);

但是,我对将责任保留给命令的责任的想法感到不满意。我对这个主题的看法是,在域内,我们应该只是 与对象交谈, ,从来没有ID。 ID不属于 无处不在的语言 而且我相信他们应该生活在域之外,例如在控制器中。

我会对这样的事情感到更加自信:

Order order = orderRepository.find(orderId);
OrderLine orderLine = em.find(OrderLine.class, orderLineId);
order.updateQuantity(orderLine, 2);

尽管我也不喜欢直接与实体经理互动的想法。我觉得我绕过了存储库和总体责任(因为我 可以, ,可能直接与订单线相互作用)。

您如何解决这个问题?

有帮助吗?

解决方案

我认为这种方法没有错:

Order order = orderRepository.find(orderId);
order.updateQuantity(orderLineId, 2);

orderLineId 是“本地身份”。它特定于汇总根,并且在其之外没有意义。您不必称其为“ ID”,可以是“订单线号”。从 埃里克·埃文(Eric Evan) 书:

边界内的实体具有本地身份,仅在汇总内部独有。

...只能通过数据库查询直接获得聚合根。所有其他对象必须通过关联的遍历找到。

其他提示

OrderLineId到底是什么?它没有意义。您正在更新产品的数量,这就是应该用作ID的产品。

Order order = orderRepository.find(orderID);
order.updateQuantity(productID, 2);

汇总根部绑定到上下文,在您的上下文中 AR,因此可以直接更新它,因为您是 暴露 直接,如果该代码影响其他实体,他们应该以AR顺序生活。

如果您想要一种更纯粹的方法,则必须在AR中制作FindbyOrderID并完全加载它,或者在您的应用程序中(然后使用第二种方法)中的订单线和OrderID。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top