新しいアプリ用の汎用リポジトリを作成する利点に関するいくつかの記事を読んでいました(例)。同じリポジトリを使用して、複数の異なるエンティティタイプに対して複数の処理を一度に実行できるため、このアイデアは素晴らしいようです。
IRepository repo = new EfRepository(); // Would normally pass through IOC into constructor
var c1 = new Country() { Name = "United States", CountryCode = "US" };
var c2 = new Country() { Name = "Canada", CountryCode = "CA" };
var c3 = new Country() { Name = "Mexico", CountryCode = "MX" };
var p1 = new Province() { Country = c1, Name = "Alabama", Abbreviation = "AL" };
var p2 = new Province() { Country = c1, Name = "Alaska", Abbreviation = "AK" };
var p3 = new Province() { Country = c2, Name = "Alberta", Abbreviation = "AB" };
repo.Add<Country>(c1);
repo.Add<Country>(c2);
repo.Add<Country>(c3);
repo.Add<Province>(p1);
repo.Add<Province>(p2);
repo.Add<Province>(p3);
repo.Save();
ただし、リポジトリの残りの実装は、Linqに大きく依存しています。
IQueryable<T> Query();
IList<T> Find(Expression<Func<T,bool>> predicate);
T Get(Expression<Func<T,bool>> predicate);
T First(Expression<Func<T,bool>> predicate);
//... and so on
このリポジトリパターンはEntity Frameworkで非常に効果的であり、DbContext / DbSetで使用可能なメソッドの1対1マッピングを提供しました。しかし、Entity Framework以外のデータアクセステクノロジーに対するLinqの採用が遅いことを考えると、DbContextを直接操作することよりもどのような利点がありますか?
リポジトリのPetaPocoバージョンを作成しようとしましたが、PetaPocoはLinq式をサポートしていないため、基本的なGetAll、GetById、Add、Update、Delete、およびSaveにのみ使用しない限り、汎用IRepositoryインターフェイスの作成はほとんど役に立ちません。メソッドを作成し、基本クラスとして使用します。次に、以前に述語として渡すことができるすべての「where」節を処理するために、特殊なメソッドを使用して特定のリポジトリを作成する必要があります。
Generic Repositoryパターンは、Entity Framework以外の何かに役立ちますか?そうでない場合、Entity Frameworkを直接操作するのではなく、なぜ誰かがそれを使用するのでしょうか?
元のリンクは、サンプルコードで使用していたパターンを反映していません。こちらが(更新されたリンク)です。