我想设置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

09-05 17:07