9

MVC 4 を使用して ASP.net で新しいプロジェクトを作成しています。

を使用して依存性注入をセットアップしたいNinject。しかし、先に進む前に、依存性注入を設定する際のベスト プラクティスは何ですか?

現在、ソリューション内のデータ プロジェクトを参照する webproject 内にバインダー クラスをセットアップしています。

バインダー クラスは次のとおりです。

 Public static class Binder
{
    static Ninject.IKernel _kernel;

    static Binder()
    {
        _kernel = new Ninject.StandardKernel();

        _kernel.Bind<IConfig>().To<AppSettingsConfig>();
        _kernel.Bind<IDocuments>().To<DocumentsClass.Documents>();

    }

    public static T GetImplementation<T>()
    {
        return _kernel.Get<T>();
    }

}

次に、コントローラー内で、GetImplementation メソッドを使用して、アプリケーションの起動時にすべてを登録するのではなく、正確な依存関係を使用します。

コントローラーのコード例:

Public ActionResult Get (int id)
{
    var repository = Binder.GetImplementation<IDocuments>();

    // do some stuff with the repository here
}

これが良いアプローチかどうかわかりませんか?どんなアドバイスでもいいです。

4

3 に答える 3

16

これは Service Locator アンチパターンの例です。詳細については、Google で何度も議論されています。

要するに、サービスロケーターに頼るのではなく

public class SomeController 
{
  public ActionResult Get (int id)
  {
      var repository = Binder.GetImplementation<IDocuments>();

      // do some stuff with the repository here
  }
}

クライアントクラスにサービスを注入する必要があります(コンストラクター注入に依存します)

public class SomeController 
{
  private IDocuments documentService { get; set; }      

  public SomeController( IDocuments documentService ) 
  {
    this.documentService = documentService;
  } 

  public ActionResult Get (int id)
  {
      var repository = documentService; 

      // do some stuff with the repository here
  }
}

この特定のケースでは、IoC コンテナーを使用してコントローラーを解決するようにコントローラー ファクトリを設定できます。

于 2013-01-03T11:59:10.810 に答える
4

Ninject のベスト プラクティスは、Ninject の MVC 拡張機能を使用することです: https://github.com/ninject/ninject.web.mvc/wiki/MVC3

于 2013-01-03T15:55:14.910 に答える
0

コントローラー内の Binder クラスのインスタンスにリンクされています。IDocuments実装の正しいインスタンスを取得するのはコントローラーの責任ではないため、クラスを再利用できなくなり、リファクタリングする必要があります。コンストラクター注入またはプロパティ注入を行う必要がある外部依存関係リゾルバー (例 - Ninject など) が必要です。

于 2013-01-03T13:47:14.173 に答える