0

Eric Evan の DDD 本、pg. 152:

実際に直接アクセスする必要がある AGGREGATE ルートにのみリポジトリを提供します。

1. 直接アクセスを必要としない集約ルートは、直接アクセスを必要とする集約ルートのリポジトリを介して取得および保存する必要がありますか?

たとえば、Aggregate ルートがCustomerありOrder、何らかの理由でOrderAR に直接アクセスする必要がない場合、注文を取得できる唯一の方法はCustomer.Ordersプロパティをトラバースすることだと思いますか?

2.いつ注文ICustomerRepositoryを取得する必要がありますか? AR が ( 経由で) 取得されるとき、またはプロパティをトラバースするとき?CustomerICustomerRepository.GetCustomerCustomer.GetOrders

3.それ自体が注文ICustomerRepositoryを取得する必要がありますか、それともこの責任を 後者の場合、1 つのオプションは に注入することです。しかし、外部コードはその存在すら認識すべきではないため(外部コードがその存在を認識している場合は、直接 を使用することもできます)、どのようにして への参照を取得する必要がありますか?IOrderRepositoryIOrderRepositoryICustomerRepositoryIOrderRepositoryIOrderRepositoryICustomerRepositoryIOrderREpository

アップデート:

1

実装に関しては、NHibernate のような ORM で行う場合、IOrderRepository は必要ありません。

a) ORM を使用する場合、ORM はリポジトリを暗黙的に提供するため、通常はリポジトリを実装する必要がないということですか?

b) ORM テクノロジの 1 つ (おそらく EF ) を学習する予定ですが、ORM について読んだことがほとんどないため、ドメイン層またはアプリケーション層を永続層から完全に切り離したい場合は、これらの 2 つの層を使用しないでください。 ORM 式。これは、ORM 式と POCO がリポジトリ実装内にのみ存在する必要があることも意味しますか?

c) 何らかの理由で AR ルートに直接アクセスできない (そしてプロジェクトが ORM を使用しない) シナリオがある場合、3. に対するあなたの答えは何ですか?

ありがとう

4

1 に答える 1

3

集計が直接アクセスを必要としない例を思いつくのは難しいです。ただし、執筆時点 (2003 年頃) では、集約間のトラバース可能なオブジェクト参照を制限または排除することは、今日ほど普及していなかったと思います。Customerしたがって、集約が集約のコレクションを参照する場合がありましたOrderOrderこのシナリオでは、 からのトラバーサルCustomerが許容されるため、 を直接参照する必要がない場合があります。

実装に関しては、NHibernate のような ORM で行う場合、IOrderRepository. 集計には、Order単にマッピングがあります。さらに、 のマッピングは、変更が対応する集約Customerにカスケードする必要があることを指定します。Order

ICustomerRepository はいつ注文を取得する必要がありますか?

これは、集約間のトラバース可能なオブジェクト参照に関する懸念を引き起こす問題です。ORM が提供する解決策は遅延読み込みですが、遅延読み込みには問題がある場合があります。理想的には、顧客の注文は必要な場合にのみ取得され、これはコンテキストによって異なります。したがって、私の提案は、集約間のトラバース可能な参照を避け、代わりにリポジトリ検索を使用することです。

アップデート

a) ICustomerRepository を実装するものが必要ですが、マッピングが構成されている場合、実装はほとんど簡単です。ORM の API に委任して、各リポジトリ メソッドを実装します。ただし、IOrderRepository は必要ありません。

b) 完全なカプセル化の場合、リポジトリ インターフェイスには ORM 固有のものは含まれません。リポジトリの実装は、リポジトリ コントラクトを ORM 仕様に適合させます。

c) 想像できないシナリオについて判断を下すのは難しいが、注文リポジトリ インターフェイスは必要ないように思われる。インジェクションも必要ありません。Customer リポジトリの実装で Order リポジトリのインスタンスを作成するだけです。

于 2013-05-22T18:33:37.017 に答える