2016-09-03 8 views
1

一般的な実装で問題を解決するにはいくつか問題があります。DbSet.Includeを自分のジェネリックインターフェイス/クラスにラップする方法

まず第一に、私は

を達成しようとしている私は、このために、私自身のリポジトリ(以降、私のUOW)を実装しようとしている私がしました:

This classes, see the diagram

だから問題は何ですか?私IRepositoryで

私はこのている:

public interface IRepository<T> where T : class 
{ 
    List<T> GetAll(); 
    /* some other methods*/ 

    //Here is my problem 
    DbQuery<T> Include<T, U>(Expression<Func<T, U>> path); 
} 

をし、私のクラスで私はこの持っている:

public class Repository<T> : IRepository<T> where T : class 
{ 
    protected readonly MyDBContext context = null; 

    protected DbSet<T> DbSet { get; set; } 

    #region Constructors 
     public Repository() 
     { 
      context = new MyDBContext(); 
      DbSet = context.Set<T>(); 
     } 

     public Repository(MyDBContext context) 
     { 
      this.context = context; 
     } 
    #endregion 

    public List<T> GetAll() 
    { 
     return DbSet.ToList(); 
    } 

    /* more code for the rest of methods*/ 

    //And here is my problem 
    DbQuery<T> Include<T, U>(Expression<Func<T, U>> path) where U : class 
    { 
     return (DbSet<T>)DbSet.Include(path); 
    } 
} 

だから、私はインターフェイスにさまざまな方法でこのメソッドを定義するためにしようと試みてきました私が使っているのは、少なくともメソッドを正しく定義しているようです。しかし、実装では、私はエラーを持っている:

私はメソッド定義に

DbQuery<T> Include(Expression<Func<T, U>> path) 
をT、Uを削除しようと試みてきた

「最高過負荷偶然がいくつかの無効な引数を持っています」

しかし、私はUを指定することはできませんし、私はエラーがあります:

"Uの型または名前空間が見つかりませんディレクティブがありますか?私はこれを行う場合は、「

DbQuery<T> Include(Expression<Func<T, T>> path) 

を私はすべてのエラーを持っていますが、Tが同じであるように、私もエラーが発生していた別のクラス

とラムダを使用するためにポイントを見逃しません

public class MyClassRepository : Repository<MyClass>, IMyClassRepository 
012:内部および外部定義

にアイデアは後にこのリポジトリは次のようにMyRepositoryを定義するために使用する必要がありますされます次いで

MyClassRepository repo = new MyClassRepository(); 

と:次いで

とのような制御装置に使用されるインターフェイスに異なる方法を規定する、今は解決しました。このため

repo.Include(o => o.MyOtherClass); 

IQueryable<T> Include(string path) 

として実装され、

ひどいではありません

repo.Include("MyOtherClass"); 

を私はラムダ機能を失い:

が、その後、私のコントローラで私はこのように使用することをしました。

誰かが私が見逃していることを察知すれば、とても感謝しています。

は、クラスレベルでそれをすでに定義したので、インクルードする方法から、一般的なT宣言を削除し、あなたにすべての

ガブリエル

答えて

1

ありがとうございます。彼らはインターフェイスには表示されませんので、

DbQuery<T> Include<U>(Expression<Func<T, U>> path); 

は、実装方法を公開するとU制約を削除することを忘れないでください。


サイドノートIDbSetが既にリポジトリであり、DbContextが既にUOWです。 IDbSetは、あなたがエンティティのメモリ内のコレクションを扱っていると思うようになり、DbContextは、IDbSetsの変更を追跡し、完了したら変更をコミットする方法を提供します。

+0

Adrian、ありがとう、時にはあなたの前に大きな灰色のゾウがあり、あなたはそれを見ることができません! 私はすでに実装しており、魅力的なように機能しています。 – Gabriel

+0

素晴らしい。レポクラスにDbContextを作成するのではなく、後でUoWを適切に実装できるようにコンストラクタを介して渡すべきです。 –

+0

@AdrianIftode文字列パスではなく、 '' i => i.NavigationProperty ''としてインクルードを実装したい場合はどうなりますか? –

関連する問題