我希望设置Ninject来进行简单的测试,同时演示使用Nuget的易用性。我想解析一个示例服务。
public interface ITestService
{
string GetMessage();
}
public class TestService : ITestService
{
public string GetMessage() { return "hello world"; }
}
我运行了NuGet Install-Package 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类创建了Kernel,但没有持有或公开对其的引用,也找不到明显的类/方法来“获取内核”。
我假设有一种Ninject的方式可以获取它,但不确定。
** * * * * * * * * * * *(最终)更新:* * * * * * * * * * * * * * * * **
再次感谢答案和评论....
更正:NinjectMVC3类创建了Kernel,并且持有对'Bootstrapper'的引用,该引用上有一个IKernel。
因此,我在App_Start/NinjectMVC3类中添加了一个“解析”方法...非常好用。
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>();
}
}