厳密に言えば、リポジトリは、ドメインオブジェクトを取得/配置するためのコレクションのセマンティクスを提供します。ドメインオブジェクトのコンシューマがそれらの詳細から切り離されるように、マテリアライゼーション実装(ORM、ハンドロール、モック)の抽象化を提供します。実際には、リポジトリは通常、エンティティ、つまりアイデンティティを持つドメインオブジェクト、通常永続的なライフサイクル(DDDフレーバでは、リポジトリが集約ルートへのアクセスを提供する)へのアクセスを抽象化します。
void Add(T entity);
void Remove(T entity);
T GetById(object id);
IEnumerable<T> Find(Specification spec);
あなたが命名の違いとするsaveOrUpdate保存/セマンティクスの追加を参照してくださいよものの以上、「純粋な」という考えです:
リポジトリのための最小限のインターフェイスは、次の通りです。 ICollectionのAdd/Removeメンバーといくつかのファインダを取得します。あなたがのIQueryableを使用しない場合は、のようなリポジトリに検索メソッドが表示されます:
FindCustomersHavingOrders();
FindCustomersHavingPremiumStatus();
この文脈でのIQueryableを使用して2つの関連する問題があります。第1の問題は、ドメインオブジェクトの関係、すなわちデメテルの法則の違反の形で実装の詳細をクライアントにリークさせる可能性である。第2の理由は、リポジトリが、ドメインオブジェクトリポジトリに属していない可能性のある責任の発見、例えば関連するデータよりも要求されたドメインオブジェクトに関する予測の発見を取得することである。
さらに、IQueryableを使用すると、パターンが破損します。IQueryableを備えたリポジトリは、「ドメインオブジェクト」へのアクセスを提供する場合も提供しない場合もあります。 IQueryableは、クエリが最終的に実行されたときに実現されるものについて、クライアントに多くのオプションを提供します。これは、IQueryableの使用に関する主な論点です。
スカラー値に関しては、スカラー値を返すためにリポジトリを使用すべきではありません。スカラが必要な場合は、通常、エンティティ自体からスカラーを取得します。これが非効率的であると思われる場合、それはありますが、負荷特性/要件によっては気付かないかもしれません。パフォーマンス上の理由、または多数のドメインオブジェクトのデータをマージする必要があるため、ドメインオブジェクトの代替ビューが必要な場合は、2つの選択肢があります。
1)エンティティのリポジトリを使用して特定のエンティティを検索し、プロジェクト/マップをフラット化したビューにします。
2)必要な平坦化されたビューをカプセル化する新しいドメインタイプを返すための専用のファインダインターフェイスを作成します。 Collectionのセマンティクスは存在しないため、これはリポジトリではありませんが、カバーの下にある既存のリポジトリを使用する可能性があります。
永続エンティティにアクセスするために「純粋な」リポジトリを使用する場合、ORMの利点のいくつかを妥協することがあります。 「純粋な」実装では、クライアントはドメインオブジェクトの使用方法に関するコンテキストを提供することができないので、リポジトリには 'ちょっと、私はcustomer.Nameプロパティを変更するつもりですその熱心に読み込まれた参照を得るのは苦労します。反対に、問題はクライアントがそのことを知るべきかどうかということです。それは両刃の剣です。
IQueryableを使用する限り、ほとんどの人は、動的なクエリ構成の利点を得るために、特にページング/並べ替えのようなクライアントの責任のためにパターンを「破壊」するのに慣れているようです。
Add(T entity);
Remove(T entity);
T GetById(object id);
IQueryable<T> Find();
を、あなたは、あなたのクエリの要件が成長するにつれて、実際にリポジトリを乱雑にすべてのそれらのカスタム検索メソッド、と離れて行うことができます。その場合、あなたが持っているかもしれません。
今日、このトピックに関するjbogardの投稿がありました:http://www.lostechies.com/blogs/jimmy_bogard/archive/2009/09/02/ddd-repository-implementation-patterns.aspx – pfries
+1: " ..ほとんどの人は、動的なクエリ構成の利点を得るためにパターンを「破る」のが快適であるように思えます... " –