DDD:通过其身份参考汇总根部内的实体
-
26-10-2019 - |
题
我坚持寻找适当的参考方法 实体 位于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。
不隶属于 StackOverflow