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);
}

Aggregate Roots

您不需要对非根对象的所有访问权限就可以通过根对象。

您只需要根对象成为一致性和持久性的边界。

因此,没有理由使用这两种方法,因为您的用户可以直接转到订单行对象:

OrderLine.Quantity = 5;

事实上,客户是聚合根,这意味着,例如,如果不将整个客户提交到数据库,就无法将此更改提交到数据库。

最肯定的是后者。如果你仔细想想,第一种方法违反了德米特定律——这确实是DDD的核心属性。

但是,如果您已经传入了订单和订单行,那么调用者为什么不执行方法调用呢?