14

MVC 3 では、私が使用していた Dependency Resolver が追加されました。誰かがコメントした質問に答えるときは、Ninject MVC 3 プラグインを使用する必要があります。

だから私の質問は、なぜそれを組み込みのものよりも使用するのですか? それが行く方法である場合、どのようにセットアップしますか?

質問

上記は私が答えた質問へのリンクです。

4

2 に答える 2

15

ASP.NET MVC 3は、実装することを選択した依存性リゾルバーにフックする依存性注入サービスを提供します。Ninject MVC 3プラグインは、 System.Web.Mvc.IDependencyResolverで定義された型解決メソッドを実装し、適切なNinjectメソッドを呼び出して要求された型を返すだけなので、その機能は非常にシンプルです。

独自のIDependencyResolverを使用してそれをNinject(または他の依存性注入フレームワーク)にマップすることを選択するか、無料で利用できるNinject MVC 3プラグインを使用することを選択するかは、ほとんどの場合些細な違いです。

これは、手巻きのNinject互換のIDependencyResolverがどのように見えるかの完全に機能する例です。Ninject MVC 3プラグインは、基本的に非常によく似ています。

public class NinjectDependencyResolver : IDependencyResolver
{
    private readonly IKernel _kernel;

    public NinjectDependencyResolver(IKernel kernel) {
        _kernel = kernel;
    }

    public object GetService(Type serviceType) {
        return _kernel.TryGet(serviceType, new IParameter[0]);
    }

    public IEnumerable<object> GetServices(Type serviceType) {
        return _kernel.GetAll(serviceType, new IParameter[0]);
    }
}

ここで重要な点は、ASP.NETMVCが本格的な依存性注入フレームワークを提供していないことです。ASP.NET MVC要求パイプライン全体の特定のポイント(コントローラーの解像度、ビューの解像度など)でIoCコンテナー(つまりNinject)を介して必要なタイプのインスタンスを取得するために必要なレイヤーのみを提供します。

注:使用した用語のいずれかが正確でない場合は、お知らせください。

于 2011-03-01T20:51:31.910 に答える
13

Ninject.Web.MVC 拡張機能 (または Ninject.MVC3 NuGet パッケージ) も内部で依存関係リゾルバーを使用します。したがって、基本的には同じメカニズムを使用しています。ただし、独自の依存関係リゾルバーを実装するのではなく、拡張機能を使用する理由がいくつかあります。

  1. まったく同じことを行う拡張機能が既にあるのに、なぜ独自の依存関係リゾルバーを実装するのでしょうか? 他のものと同じ実装を使用すると、問題が発生したときにサポートがはるかに簡単になります。さらに、同じ実装を使用すればするほど安定します。(ポイント 4 を参照)。
  2. 拡張機能は、単なる依存関係リゾルバーではありません。拡張機能に付属するすべての機能のリストについては、http://www.planetgeek.ch/2010/11/13/official-ninject-mvc-extension-gets-support-for-mvc3/を参照してください。
  3. リクエストがデフォルトで終了した後、オブジェクト InRequestScope の高速非アクティブ化のサポートを追加します。これにより、負荷の高いアプリケーションで OutOfMemory 例外が発生するのを防ぎます。
  4. 投稿の依存関係リゾルバーと上記の依存関係リゾルバーの両方に問題があります。負荷が高い状況では、アプリケーションがクラッシュし、アプリケーションを再起動するまで黄色の死のページしか表示されません。障害のある依存関係リゾルバーが使用されているという理由だけで、将来出てくるすべての質問に答えるのは好きではありません。少なくとも .ToList() を GetServices に追加します
  5. InRequestScope のサポートは Ninject 2.4 で削除され、System.Web への依存関係が削除され、ビルド ターゲットの数が削減されます。これは重大な変更です。しかし、Web 拡張機能の 1 つに基づくプロジェクトを再び実行するには、非常に最小限の変更しか必要ありません。InRequestScope は、これらの拡張機能のいずれかを使用するプロジェクトで引き続き使用できます。カスタム実装では、サポート自体を追加する必要があります。
于 2011-03-02T00:14:57.627 に答える