2012-02-23 153 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; 

客戶是聚合根只是簡單的意味着沒有辦法,例如,將此更改提交到數據庫而不將整個客戶提交到數據庫。