我想设置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的构造函数作为参数.... 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类创建内核,并且保持对'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>();
}
}
答案 0 :(得分:16)
步骤:
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>();
}
答案 1 :(得分:4)
将ITestService作为构造函数参数添加到控制器:
private ITestService service; public MyController(ITestService service) { this.service = service; } public ActionResult Index() { ViewBag.Message = this.service.GetMessage(); return View(); }
Ninject会自动将ITestService注入您的控制器。然后使用Index方法中的服务字段。
或者,如果您不希望Ninject注入您的控制器构造函数,您可以保留您创建的内核,然后在Index方法中调用kernel.Get&lt; ITestService&gt;()来获取实例:< / p>
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(); }