2017-11-04 8 views
0

ビジネスロジックプロジェクトを使用して汎用データアクセスレイヤを作成する必要があります。ビジネスロジックレイヤはリポジトリを持つDALレイヤと対話する必要があります。 短命のデータコンテキストと、IQueryableではなくIEnumerableを返すすべてのリポジトリメソッドが必要です。 GetAllメソッドの例でプロンプトを表示して、ThenIncludeまたはDependent Tableを選択して、接続されたデータを抽出する方法を説明します。エンティティフレームワークのコア、インクルードナビゲーションプロパティを使用した汎用リポジトリメソッド

public class GenericDataRepository<T> : IGenericDataRepository<T> where T : class 
{ 
    public virtual IList<T> GetAll(params Expression<Func<T, object>>[] navigationProperties) 
    { 

     List<T> list; 
     using (var context = new Context()) 
     { 
      IQueryable<T> dbQuery = context.Set<T>(); 

      //Apply eager loading 
      foreach (Expression<Func<T, object>> navigationProperty in navigationProperties) 
       dbQuery = dbQuery.Include<T, object>(navigationProperty); 

      list = dbQuery 
       .AsNoTracking() 
       .ToList<T>(); 
     } 
     return list; 
    } 

}

ThenInclude(PROP2 => prop2.i)?

dbQuery.Include(navigationProperty).ThenInclude(PROP2 => prop2.i)

答えて

0

これは実際に悪いデザインです。あなたはこれをしたくありません。データアクセスレイヤを抽象化したい場合は、完全に行います。アプリケーションのAPIを提供するライブラリを作成します。ライブラリは必要なものを正確に返します。任意のクエリを許可する場合は、コンテキストを直接利用してください。実際には、管理する追加のレイヤー以外には何も実際には購入していません。実際のメリットはありません。

+0

ありがとうございます。 データにアクセスするためのAPIを作成したかったので、ビジネスロジックのレイヤーを使用しました。将来的には、EFをダッパーで置き換えることができ、EFはマイグレーションのためだけに残しておきます。私はIGurebleのレイヤー、つまりビジネスロジックについて助言してくれますか?データアクセスレイヤーから抽象化された、私はビジネスロジックのレイヤーが必要です。 ビジネスロジック - >リポジトリ - > EF-> Db – Aldmi

+0

このようなアダプタを切り替えると、問合せをどのように構築する必要があるかに重大な影響を及ぼす可能性があります。それが本当に目標であれば、アプリは 'layer.Get(someQuery、includeSomeStuff、moreLogic)'ではなく、 'layer.GetSomeSpecificThing()'のようなメソッドに依存したいと思っています。それは、無限に保守性と適合性が向上します。 –

+0

はい、あなたは正しいです、ビジネスロジックは、多くの特定の方法を含み、リポジトリとの仕事を1つの特定の方法に組み合わせます。そして、EF上でデータへのアクセスを作成するようにアドバイスしますか? – Aldmi

関連する問題