2009-09-25 14 views
16

私は2つのエンティティFooとBarを持っているとしましょう。 Fooは集約ルートであり、Barを含みます。私の知る限り理解し、それは次のようになります。私は、ユーザーが定義されたリストからFOOSためのバーを選択(およびそれを変更)するための機能を提供したいDDD:集計根の質問

public class Foo{ 
    private readonly Bar Bar; 
} 

リポジトリが集約ルートのものであると仮定されているのは、Barエンティティのリポジトリが存在しないことを意味します。

これは問題につながります.Fooへの参照なしに、Barを個別に作成/更新することはできません。

BarはFooなしでは意味がないにもかかわらず、リポジトリを持っているはずですか?

+0

愚かな質問、ちょうど愚かな答えのようなものを発見した可能性があり;)ところで、この質問は私をたくさん – Eldar

答えて

16

Fooに関連付けられていないバーのリストから選択する場合、これは集約ルートではありません。例えば、Orderを持たないOrderItemのリストを取得することはできないため、これは単一の集約ルート(Order)ですが、ProductがOrderItemsに割り当てるリストを取得できるため、ProductはOrder集約ルートの一部ではありません。

OrderItemはOrder aggregate rootの一部ですが、依然として独自に作成して更新することができます。しかし、あなたはOrderを参照することなくそれを得ることはできません。あなたのバーと同じですが、それがFooの一部であったとしても、それぞれ(Foo.Bars)を取得し、Foo.AddBar(new Bar())を実行することができます。しかし、Foo without Listを取得する必要がある場合、BarはFoo集約の一部ではありません。これは別のエンティティです。

ここで私はDDDを見ていますが、もちろんEric Evansではありません。集計根を持つため

+0

これは意味があります。あなたが何か言いたいことがあれば - 行ってください。 :) –

+0

私が学んだことは - 私のドメインにあまりにも多くの集約のルーツがあります。独立して更新すべきではないにもかかわらず、根として作成されたエンティティがあります。さらに悪いことに、いくつかのルーツは値オブジェクトとして置き換えることができます。 –

+1

別の提案は、あなたのBarがスタンドアロン(独立したリストとして提示することができます)と従属(Fooの内部で動作する)である場合、同時に2つのエンティティを実際に持っているかもしれません。簡単な例:Group {Name、Price} - Order/Productの内側と別に表示する必要がありますが、Group {Name}とProductGroup {Group、Price}に分割した場合、集計の – queen3

2

バーがエンティティである必要がありますか?それを追跡し、ドメイン内で変更する必要がありますか?値オブジェクトとして見ることができれば、サービスからフェッチし、選択した値オブジェクトをFooエンティティに「接続」することをお勧めします。ドロップダウンリストを介して瞬間。

+0

を助け、なぜエンティティがすることはできませんサービスを通じてフェッチされ、Fooに接続されていますか? –

+0

エンティティのコンテキストなしで値オブジェクトを作成/更新する方法はありますか?価値オブジェクトが持ってはならないリポジトリとしてサービスをマスキングするのではないでしょうか? –

+0

私はこれをどのようにしたのか説明しましょう。永続レイヤーからデータを取得する方法が必要です。 DTOを使用してデータを取得することはできますが、値オブジェクトを使用するのは、DTOから値オブジェクトにマッピングせずにドメイン内のオブジェクトを使用できるためです。私が使用しているオブジェクトは、あなたのケースのBarにある集約ルートのクラスです。もし私がエンティティに対してこれをやろうとすれば、DTO(サービスを介して取得)を使ってリスト(コンボボックスなど)を埋めると思います。私が正しいバーを選択すると、リポジトリに私に完全なオブジェクト集約ルートから。これが理にかなってほしい。 – Fossmo

8

理由があります:彼らは制御され、複合事業体へのアクセスを指示提供

  1. 彼らは、全体の集計が有効であることを確認するためのルールを強制することができ

マイtake: FooのないオブジェクトをBarに選択する必要がある場合は、BarRepositoryを使用します。

しかし... あなたはBar何を更新した場合、それはそれは親Fooだの検証ルールを破りますか?これが起こる可能性がある場合は、Fooを経由してBarにアクセスしてください。

の場合は、しかし、あなたはBarオブジェクト(例えばバッチジョブやレポートのために)の束にアクセスする必要がある、とあなたはFoosことは、壊れた取得先に行くとBarRepository経由でアクセスしないことを知っている

集約ルートは、他の集約ルートで構成できます。あなたはBarBarRepositoryのためにあなたに正当性を与え、集約ルートそのものではないこと:)