聚合根

时间:2012-02-23 15:38:54

标签: c# .net design-patterns domain-driven-design

考虑以下结构:Customer-> Orders-> OrderLines-> Quantity和Customer是聚合根。

假设我们想要更改一个OrderLine的数量,我们将如何做?客户会有这样的方法:

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

2 个答案:

答案 0 :(得分:7)

绝对是后者。如果您考虑一下,第一种方法违反了Law of Demeter - 这实际上是DDD的核心属性。

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

答案 1 :(得分:7)

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

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

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

OrderLine.Quantity = 5;

客户是聚合根的事实只是意味着没有办法,例如,在不将整个客户提交到数据库的情况下将此更改提交到数据库。