ninject.mvc3、nuget、webactivator oh my
-
24-10-2019 - |
質問
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(); }
他のヒント
ステップ:
- 新しいASP.NET MVC 3プロジェクトを作成します
- パッケージコンソールからNUGETパッケージをインストールします。
Install-Package Ninject.MVC3
HomeController:
public class HomeController : Controller { private readonly ITestService _service; public HomeController(ITestService service) { _service = service; } public ActionResult Index() { ViewBag.Message = _service.GetMessage(); return View(); } }
の
App_Start/NinjectMVC3.cs
:private static void RegisterServices(IKernel kernel) { kernel.Bind<ITestService>().To<TestService>(); }