我一直在寻找正确的参考方式entities位于一个聚合根,当我们只得到他们的身份来自 URL 参数。我问了一个上一个问题 https://stackoverflow.com/questions/7196820/update-an-entity-inside-an-aggregate最终集中于值对象,所以我在这里从另一个例子开始。
假设我们要修改一个OrderLine
里面一个Order
:
- 用户进入一个页面,在该页面中他可以看到订单摘要及其所有订单行。
- 用户点击edit订单行旁边的按钮。
- 他被引导至
edit-order-line?orderId=x&orderLineId=y
现在,如果我需要更新 OrderLine 中的数量,我可以这样做:
Order order = orderRepository.find(orderId);
order.updateQuantity(orderLineId, 2);
然而,我对将责任留给凤凰社通过 Id 取回其自身部分的想法感到不太舒服。我对这个问题的看法是,在这个领域内,我们应该与物体交谈,并且从不使用 Id。 Id 不属于无处不在的语言我相信它们应该位于域之外,例如在控制器中。
我会对以下事情感到更有信心:
Order order = orderRepository.find(orderId);
OrderLine orderLine = em.find(OrderLine.class, orderLineId);
order.updateQuantity(orderLine, 2);
尽管我也不喜欢直接与实体管理器交互的想法。我觉得我正在绕过存储库和聚合根的职责(因为我could,可能直接与 OrderLine 交互)。
你如何解决这个问题?
在我看来,这种做法并没有什么问题:
Order order = orderRepository.find(orderId);
order.updateQuantity(orderLineId, 2);
orderLineId
是“本地身份”。它特定于聚合根,在其之外没有意义。您不必将其称为“id”,它可以是“订单行编号”。从埃里克·埃文斯 https://rads.stackoverflow.com/amzn/click/com/0321125215 book:
边界内的实体具有本地身份,仅在边界内唯一
聚合。
...只能通过数据库查询直接获得 AGGREGATE 根。所有其他对象必须通过遍历关联来找到。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)