我想设置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>();
}
现在,我想“使用” Ninjet来解决我的ITestService。
public ActionResult Index()
{
//[Ninject, give me the service I need]
ITestService service = ???
ViewBag.Message = service.GetMessage();
return View();
}
设置Ninject还有另外一部分吗?
我需要提供解析器吗?
解决ITestService所需的代码是什么。
谢谢帮助»
** * * * * * * * * * * * *更新:* * * * * * * * * * * * * * * * * **
感谢您对“控制器构造函数”注入的热烈响应。
只需添加带有ITestServcice作为参数的构造函数即可。
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类创建内核,并且确实保留对“ Bootstrapper”的引用,该引用作为其上的IKernel。
所以我在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作为构造函数参数添加到您的控制器:
私有ITestService服务;
公共MyController(ITestService服务)
{
this.service =服务;
}
公共ActionResult Index()
{
ViewBag.Message = this.service.GetMessage();
返回View();
}
Ninject将自动将ITestService注入您的控制器。然后使用Index方法中的service字段。
或者,如果您不希望Ninject注入到控制器构造函数中,则可以保留创建的内核,然后在Index方法内部,调用kernel.Get ()来获取实例:
公共ActionResult Index()
{
var kernel = ... //获取在应用程序启动时创建的内核。
ITestService服务= kernel.Get ();
ViewBag.Message = service.GetMessage();
返回View();
}
看看Ninject dependency inject for controllers in MVC3。