新しいEFコードファーストの使い方を理解しようとしていますが、Include
の機能を半汎用リポジトリクラスに適合させる方法を考えていません。 (私は、セミジェネリックと言うのは、クラスがジェネリックではなくメソッドだけなので、基本的には集合体をラップするリポジトリが1つだけでなく、その集合体の一部であるすべてのエンティティと対話できます。 )(半)汎用リポジトリに含まれています
私の状況は私が常にニーズがロードされることを一人の子供を持つエンティティを持っている、とだけ、必要に応じてロードされている他の子供たちは、私は私のリポジトリ法上の簡単なブールパラメータを含めます。これと同様に:私のベースのリポジトリである、と私は、派生クラスのものXyzInclude
メソッドをオーバーライドできるようにしたいと思い
public S GetByID<S>(int entityID, bool loadChildren = false) where S : class
{
DbSet<S> set = _context.Set<S>();
if (loadChildren)
set = FullInclude<S>(set);
else
set = DefaultInclude<S>(set);
return set.Find(entityID);
}
protected virtual DbSet<S> DefaultInclude<S>(DbSet<S> set) where S : class
{
// base implementation just returns the set
// derived versions would attach Includes to the set before returning it
return set;
}
protected virtual DbSet<S> FullInclude<S>(DbSet<S> set) where S : class
{
// base implementation just returns the set
// derived versions would attach Includes to the set before returning it
return set;
}
。しかし、それらを非ジェネリックな実装でオーバーライドする必要があります。これは明らかに言語レベルでは機能しません。
これはLinq2Sqlでは、DataLoadOptions
オブジェクトを設定してコンテキストにアタッチするだけで簡単でした。 Include
APIがDbSet
になっていないので、これを行うにはどのように最善を尽くすのか困っています。戦略パターンなどの簡単な実装に関する推奨事項を探しています。
編集:私の質問の本質は、実際に非ジェネリックな派生バージョンでジェネリックメソッドをオーバーライドすることだと思います。私はそれを可能にするパターンまたは技術を探しています。拡張メソッドは私が見ている一つのことですが、誰かがあればもっと純粋なソリューションを好むでしょう。
これは興味深いアプローチですが、私があまり気にしていないことは、インクルードが1か所にあることです。私がそれを持っている問題は、あなたが状況に応じて異なることを望むかもしれないということです。ポケットベルの顧客のリストを取得している間は、プロフィール、投稿、請求書の情報は必要ありませんが、ユーザーの詳細ページではすべての情報が必要です –
それは私の頭の中でちょっと議論したジレンマですこれを行う最善の方法を理解しようとしています。私は今のところ最も単純なオプションを使っていました(1つの場所でそれらを定義する)が、進化したデザインでは各メソッドが独自のインクルードを定義し、それをクラスレベルの変数ではなくパラメータとしてベースリポジトリに送ります。私が上にリンクしたLadislavからの答えはその要点をカバーしています。 – sliderhouserules