Aggregate Roots
本文关键字:Roots Aggregate | 更新日期: 2023-09-27 18:25:38
考虑以下结构:Customer->Orders->OrderLines->Quantity,Customer是聚合根。
假设我们想更改一个订单行的数量,我们将如何做到这一点?客户会有这样的方法吗:
public ChangeQuantity(Order order, OrderLine orderLine, int quantity)
{
order.OrderLines.First(...).Quantity = quantity;
}
或者实现方式是:
public ChangeQuantity(Order order, OrderLine orderLine, int quantity)
{
order.ChangeQuantity(orderLine, quantity);
}
您不需要对非根对象的所有访问权限就可以通过根对象。
您只需要根对象成为一致性和持久性的边界。
因此,没有理由使用这两种方法,因为您的用户可以直接转到订单行对象:
OrderLine.Quantity = 5;
事实上,客户是聚合根,这意味着,例如,如果不将整个客户提交到数据库,就无法将此更改提交到数据库。
最肯定的是后者。如果你仔细想想,第一种方法违反了德米特定律——这确实是DDD的核心属性。
但是,如果您已经传入了订单和订单行,那么调用者为什么不执行方法调用呢?