2

抽象的なドキュメントエンティティと複数の派生エンティティ(ブログ、ページなど)を使用して、階層ごとのテーブルエンティティデータモデルを実装しました。私は唯一のリポジトリを実装する1つのクラスを持ち、メソッドから復帰するタイプとして文書を使用してこのEntity Frameworkとリポジトリパターンを使用した階層ごとのテーブル

public Document Load(Guid firmId, int prettyId) 
{ 
    // the OfType<> can be OfType<Page>, OfType<Blog>, ... 
    var instance = (from c in _ctx.Documents.OfType<X>() where c.firm_id == firmId && c.PrettyId == prettyId select c).FirstOrDefault(); 
    ... 
} 

ような文書実体を使用してメソッドのシグネチャとのリポジトリインターフェースを有しています。ロード、挿入、および更新の実装仕様がすべて同じであるため、Documentから派生したさまざまな型のカスタム実装は必要ありません。私は、作業したいメソッドに型を識別/提供する必要があります。

私が言っていることを理解していただければと思います。 TPHをモデル化する方法については、私がすでに行っているので参考にしてください。それはモデル化されています。

答えて

1

実際に私は実行時の検出が必要でないことを発見しました。リポジトリとは異なり、コンパイル時にタイプを指定できます(1つだけです)タイプ固有です(私はPageController、BlogController、など)、次のように:私のリポジトリのインターフェースで

public virtual ActionResult Print(int prettyId) 
{ 
    //Document invoice = _repository.Load(prettyId, _docType); 
    Document invoice = _repository.Load<Invoice>(prettyId); 
    ... 
} 

私は今、この持っている:

// also, please comment, which one is better, this one? 
T Load<T>(int prettyId) where T : Document; 
T Load<T>(Guid firmId, int prettyId) where T : Document; 

// or this one? 
//T Load<T1>(int prettyId) where T1 : Document; 
//T Load<T1>(Guid firmId, int prettyId) where T1 : Document; 

を、リポジトリの実装に私はこの持っている:

これはうまく見えます。

+0

うん、これは私がしていることです。任意のタイプの多型(例:抽象クラス)を使用する場合、ジェネリックスは良いケースです。あなたのインターフェースに関しては、第1のコメントと第2のコメント(コメントアウトされたもの)の間に違いはありません。 1つはTの型パラメータ/制約を持ち、もう1つはT1を持つ。これらは型パラメータのエイリアスです。何でも構いませんが、違いはありません。あなたの場合、私はそれらをより明示的にするために 'TDocument'と命名します。あなたの実装については、そこにあるすべての型に対して '.Load()'を実行しません。メソッドのシグネチャはそれを行うことを指示していないためです。私は拡張メソッドを使ってそれを行います。 – RPM1984

+0

ああ、これもあなた自身のために考えています - +1。 – RPM1984

+0

参照の読み込みのための拡張メソッドのサンプルを提供できますか? – mare

0

ロードする特殊なドキュメントタイプごとに個別のメソッドを作成するか、またはswitch/caseステートメントを、ある種の識別子をLoadメソッドのパラメータとして使用するのが簡単な方法です。私はあなたがそのような解決策を避けたいと思っています。その場合、実行時にジェネリック型パラメータを提供することはできないため、リフレクションを使用するようにしてください。このanswerをチェックして、リフレクトで汎用メソッドを呼び出します。 OfTypeで基本クエリーを呼び出し、条件のある場所でクエリーの2番目の部分に使用されるIQueryalbeのインスタンスを取得します。

関連する問題