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>();
}
}