2

私は異なるモデルへの約7つのドロップダウンを備えた大きなビューを持っています...したがって、私のコントローラーのコンストラクターには、次のように9つのIRepositoryがあります:

public CrudController(IRepository<Class1> class1Rep, IRepository<Class2> class2Rep,  ... 
IRepository<Class9> class9Rep)
{
    this.class1Rep = class1Rep;
   ...
    this.class9Rep = class9Rep;
}

したがって、ViewModel に必要なすべてのデータを入力できます...

それは正しい方法ですか?私はNinjectを使用しています...

ありがとう

4

3 に答える 3

1

SRPに違反しているようです。各ビュー モデルにはすべてのリポジトリが必要ですか? 一部の ViewModel はカップルだけを使用しますか? ViewModel を作成するために他の複雑な作業を行っていますか? もしそうなら、ViewModel 構築の一般的な概念を抽象化し、理想的には Automapper のようなものを使用してマッピングを削除します。

IModelEnricher<T>T が ViewModel であるを使用して、選択リストやその他の複雑な作業を設定するという概念を抽象化します。IModelEnricher<T>T ViewModel のインスタンスを取り、インスタンス T を返す 1 つのメソッド Enrich を定義します。Enrich メソッドでは、必要な巧妙な作業を行います。ViewModel に 2 つのリポジトリが必要な場合は、それらをコンストラクターに注入するだけです。IModelEnricher<T>

IModelEnricher を自動的に使用して、Action の結果から返される ViewModel を強化します。また、常に同じパイプラインでドメイン モデルを ViewModel に自動マッピングします。Automapper が Domain Model から ViewModel への取得を処理し、エンリッチャーが追加処理を行うため、ほとんどの Get コントローラー アクションは 1 行のコードです。

retrun AutoMappedView<AConcreteViewModel>(repository.Find(id))

IModelEnricher を実装するクラスが見つかった場合は、AConcreteViewModelそれが呼び出され、すべての作業が行われます。

    public class AConcreteViewModelEnricher:IModelEnricher<AConcreteViewModel>{

    AConcreteViewModelEnricher(Repo1 repo1, Reop2 rep2){
........
}

    AConcreteViewModel Enrich(AConcreteViewModel model){
           //Do stuff with repo etc and 
            return model
    }
}

ドロップダウンに関する他の質問に対する私の回答をご覧ください。

于 2013-10-08T19:45:17.713 に答える
1

簡単な答えの 1 つは、すべてのリポジトリを含むラッパー クラスを作成することです。その後、ラッパー クラスを渡すだけで済みます。

ただし、ほとんどの純粋主義者は、それほど多くのリポジトリがある場合、おそらく単一責任の原則に違反しており、機能を他のクラスに分割する必要があると言うでしょう。

于 2013-10-03T19:45:45.960 に答える