14

Ninjectをセットアップして簡単なテストを実行し、Nugetを使用したセットアップの容易さを示したいと思います。サンプルサービスを解決したい。

public interface ITestService
{
    string GetMessage();
}
public class TestService : ITestService 
{
    public string GetMessage() { return "hello world"; }
}

NuGet Install-Package NinjectMVC3 ....を実行すると、NinjectMVC3.csがいくつかのWebActivator属性で装飾されたApp_Startフォルダーに適切にドロップされてすべてが読み込まれます。

次に、バインディングをNinjectMVC3.RegisterServicesメソッドに追加します。

private static void RegisterServices(IKernel kernel)
{
   kernel.Bind<ITestService>().To<TestServiceOne>();
}

次に、Ninjetを使用してITestServiceを解決します。

public ActionResult Index()
{
  //[Ninject, give me the service I need]
  ITestService service = ??? 

  ViewBag.Message = service.GetMessage();
  return View();
}

Ninjectを設定する別の部分はありますか?リゾルバーを提供する必要がありますか?

ITestServiceを解決するために必要なコードは何ですか。

助けを求める»

** * * * * * * * * * * * アップデート: * * * * * * * * * * * * * * * * **

'コントローラーコンストラクター'インジェクションに関する素晴らしい回答をありがとう。ITestServciceをパラメーターとして使用してコンストラクターを追加するだけです....BAMM!!!

private ITestService _service;

public HomeController(ITestService service)
{
  _service = service
}
public ActionResult Index()
{
  ViewBag.Message = _service.GetMessage();
  return View();
}

カーネルを直接取得する必要がある場合の理想的なソリューションは何ですか。

var kernel = ... // Go grab the kernel from ????? (thanks Judah).
ITestService service = kernel.Get<ITestService>();

NinjectMVC3クラスがカーネルを作成しているのを見ることができますが、それへの参照を保持または公開していません。また、「カーネルを取得する」ための明白なクラス/メソッドを見つけることもできません。

私はあなたがそれを手に入れるためのNinjectの方法だと思いますが、確かではありません。

** * * * * * * * * * * *(最終)更新:* * * * * * * * * * * * * * * * **

回答とコメントを再度ありがとう...。

訂正:NinjectMVC3クラスはカーネルを作成し、その上にIKernelとしてある「Bootstrapper」への参照を保持します。

そこで、App_Start/NinjectMVC3クラスに「resolve」メソッドを追加しました...うまく機能します。

public static class NinjectMVC3 /// created by the NinjectMVC3 NuGet  Packagae
{
   // add method to provide a global resolver.   
   public static T Resolve<T>()
   {
       return bootstrapper.Kernel.Get<T>();
   }
}
4

2 に答える 2

16

手順:

  1. 新しいASP.NETMVC3プロジェクトを作成します
  2. パッケージコンソールからNuGetパッケージをインストールします。Install-Package Ninject.MVC3
  3. HomeControllerの場合:

    public class HomeController : Controller
    {
        private readonly ITestService _service;
        public HomeController(ITestService service)
        {
            _service = service;
        }
    
        public ActionResult Index()
        {
            ViewBag.Message = _service.GetMessage();
            return View();
        }
    }
    
  4. App_Start/NinjectMVC3.cs

    private static void RegisterServices(IKernel kernel)
    {
        kernel.Bind<ITestService>().To<TestService>();
    }       
    
于 2011-03-15T17:02:17.390 に答える
4

ITestServiceをコンストラクターパラメーターとしてコントローラーに追加します。

プライベートITestServiceサービス。

public MyController(ITestService service)
{{
   this.service=サービス;
}

public ActionResult Index()
{{
  ViewBag.Message = this.service.GetMessage();
  View();を返します。
}

Ninjectは、自動的にITestServiceをコントローラーに注入します。次に、Indexメソッド内のサービスフィールドを使用します。


または、Ninjectをコントローラーコンストラクターに挿入したくない場合は、作成したカーネルを維持してから、Indexメソッド内でkernel.Get <ITestService>()を呼び出してインスタンスを取得します。

public ActionResult Index()
{{
  var kernel =...//アプリの起動時に作成したカーネルを取得します。
  ITestServiceサービス=kernel.Get<ITestService>();

  ViewBag.Message = service.GetMessage();
  View();を返します。
}

MVC3のコントローラーのNinject依存性注入をご覧ください。

于 2011-03-15T16:59:57.817 に答える