2012-02-23 129 views
1

考虑以下结构: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); 
} 

回答

7

最绝的是后者。如果你仔细想想,第一种方法违反了Law of Demeter - 这实际上是DDD的核心属性。

但是,如果您已经通过命令和命令行,为什么调用者执行方法调用?

+1

+1最后一句。 – Domenic 2012-02-23 15:44:21

+1

我回应@ Do​​menic对最后一句话的赞美。但是,我怀疑有些人可能会错过它的观点。考虑一批“客户”;你想检索一个给定的客户端,所以你的表达式是'clients.First(c => c.ID == client.ID)'。在大多数情况下,这个表达式会返回一个引用*给变量'client'!*所引用的同一个对象。所以不是像这样的语句:'clients.First(c => c.ID == client.ID)。 UpdateAddress(newAddress);'你最好用这个:'client.UpdateAddress(newAddress);'。 BrokenGlass,如果我错了,请纠正我。 – phoog 2012-02-23 15:56:04

7

您不需要通过根对象访问所有非根对象。

你只需要根对象是一致性和持久性边界。

所以没有理由有两种方法,因为你的用户可以去直接在命令行对象:

OrderLine.Quantity = 5; 

客户是聚合根只是简单的意味着没有办法,例如,将此更改提交到数据库而不将整个客户提交到数据库。