2012-02-23 11 views
1

次の構造を考慮してください。Customer-> Orders-> OrderLines-> QuantityおよびCustomerは集約ルートです。集合ルート

1つの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

+1

私は最後の文に対するDomenicの賞賛をエコーし​​ます。しかし、私はいくつかは、そのポイントを見逃すかもしれないと思う。 'Clients'のコレクションを考えてみましょう。与えられたクライアントを取得したいので、あなたの式は 'clients.First(c => c.ID == client.ID)'です。ほとんどの場合、この式は 'client'変数によって参照される同じオブジェクトに参照*を返します!*このような文ではなく、' clients.First(c => c.ID == client.ID)です。 UpdateAddress(newAddress); 'これでよりうまくいく:' client.UpdateAddress(newAddress); '。私が間違っている場合、私を修正してください。 – phoog

7

ルートオブジェクトを通過するために非ルートオブジェクトにすべてのアクセスをする必要はありません。

一貫性と永続性境界としてルートオブジェクトが必要です。

ユーザーだけで直接オーダーラインオブジェクトに行くことができるので、だから、方法のいずれかを持ってする理由は、ありません。

OrderLine.Quantity = 5; 

顧客が集約ルートであるという事実は、単に、に方法がないことを意味したとえば、顧客全体をデータベースにコミットすることなく、この変更をデータベースにコミットします。

関連する問題