質問

Ninjectをセットアップして簡単なテストを行うだけでなく、Nugetを使用した設定のしやすさを実証したいと思います。サンプルサービスを解決したいです。

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

NUGETインストールパッケージNINJECTMVC3を実行します。...NINJECTMVC3.CSをAPP_STARTフォルダーにうまくドロップし、Webactivator属性で装飾してすべてをロードします。

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

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

今、私は自分のitestServiceを解決するためにninjetを「使用」したいと思います。

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

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

Ninjectをセットアップする別の部分はありますか?リゾルバーを提供する必要がありますか?

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

サクラントヘルプ»

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

「コントローラーコンストラクター」インジェクションに関する素晴らしい回答をありがとう。 ItestServciceを備えたコンストラクターをParam .... 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クラスがカーネルを作成するのを見ることができますが、それへの参照を保持または公開することも、「カーネルを取得する」ための明らかなクラス/方法を見つけることもできません。

私はあなたがそれを得るためのニンゲリの方法だと思いますが、確かではありません。

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

答えとコメントをありがとう...

修正:NINJECTMVC3クラスはカーネルを作成し、「ブートストラッパー」への参照を保持します。

そこで、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>();
   }
}
役に立ちましたか?

解決

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

private ITestService service;

public MyController(ITestService service)
{
   this.service = service;
}

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

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


あるいは、ninjectをコントローラーコンストラクターに注入したくない場合は、作成したカーネルの周りに保持し、インデックスメソッド内でkernel.getを呼び出します。u003CITestService> ()インスタンスをつかむには:

public ActionResult Index()
{
  var kernel = ... // Go grab the kernel we created back in app startup.
  ITestService service = kernel.Get<ITestService>();

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

見て MVC3のコントローラーには、NINJECT依存関係が注入されます.

他のヒント

ステップ:

  1. 新しいASP.NET MVC 3プロジェクトを作成します
  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>();
    }       
    
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top