【发布时间】:2011-07-15 23:04:11
【问题描述】:
我想设置 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 类创建了内核,但没有持有或公开对它的引用,也找不到明显的类/方法来“获取内核”。
我认为你是 Ninject 获得它的方法,但不确定。
** * * * * * * * * * * *(最终)更新:* * * * * * * * * * * * * * * **
再次感谢您的回答和cmets ....
更正:NinjectMVC3 类创建内核,并且确实持有对“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>();
}
}
【问题讨论】:
-
这当然是一个见仁见智的问题,但是您的 NinjectMVC3.Resolve
静态方法是服务定位器反模式的一个示例。一般来说,依赖注入应该是一种“告诉,不要问”的事情。 Mark Seemann 在他的博客上讨论了这个问题,这可能有助于澄清一些事情。 blog.ploeh.dk/2010/02/03/ServiceLocatorIsAnAntiPattern.aspx
标签: asp.net-mvc asp.net-mvc-3 ninject nuget webactivator