この問題を要約する2つの引用符から始めましょう。「DbContextのまとめはリークの多い抽象化です。何があっても、サービス/コントローラー層でEFに何らかの依存関係が生じることになります。」引用参照 および2番目の引用:
「DbContextクラス
Unit-Of-WorkパターンとRepositoryパターンの組み合わせを表し、データベースにクエリを実行して変更をグループ化し、変更を1つの単位としてストアに書き戻すことができます。」MSDN
リポジトリパターンでは、データベースを単純にスワップアウトできるとは言わないでください。そうではありません。成熟したアプリケーションでそれを行った人はいますか?また、リポジトリパターンがIQueryableを公開してはならないという回答もしないでください。これは、一緒に作業している人を信頼していないという別の言い方だと思います。
私はすべてカプセル化、コードカバレッジ/テスト容易性を求めていますが、EFのこの人気のあるリポジトリパターンはIQueryableを公開しているため、パターンの必要性はなくなったようです。
public interface IRepository<T> where T : class
{
IQueryable<T> GetAll();
T GetById(int id);
IEnumerable<T> Get(Expression<Func<T, bool>> filter = null,Func<IQueryable<T>,IOrderedQueryable<T>> orderBy = null, string includeProperties = "");
void Add(T entity);
void Update(T entity);
void Delete(T entity);
void Delete(int id);
}
UOWパターンと組み合わせたリポジトリパターンの唯一の利点は次のとおりです。1。依存性注入パターンを簡単に有効にして、テスト容易性/コードカバレッジを向上させます。2。外部統合(さまざまなベンダー、Web API、データベースへのWebサービス呼び出し)に存在する複雑さをカプセル化します。 、など。)
では、MyDbContext:DbContextクラスを使用しても得られないカプセル化は何ですか?私のORMは抽象化です。確かに、UOWの作業と、追加や削除などの一般的なクエリを使用して、コントローラーの均一性をある程度得ることができますが、それは本当に努力する価値があります。私は自分の開発者が統一されていると信じることはできません。彼らが少しでもそれをやるときは、それについてOCDを取得しないでください。そして、コントローラーは必要なクエリを記述できるので、これは単体テストに直面してもうまくいきませんか?そして(さらに大きなキャップ笑)呼び出すサードパーティのAPIがある場合は、コントローラーのMyDbContextクラスでこれにアクセスできるようにすることができるので、コントローラーへの別のデータ呼び出しのように見えます。
もう一度言いますが、ORMを直接使用しないのは、データの抽象化です。
リポジトリパターンに対するいくつかの議論は次のとおりです。
http://ayende.com/blog/3955/repository-is-the-new-singleton
http://lostechies.com/jimmybogard/2012/09/20/limiting-your-abstractions/
http://lostechies.com/jimmybogard/2012/10/08/favor-query-objects-over-repositories/
リポジトリパターンの適切な議論は次のとおりです(ただし、十分に説得力はありません): http: //www.sapiensworks.com/blog/post/2012/10/10/Do-We-Need-The-Repository-Pattern.aspx