我想設置Ninject做一個簡單的測試,以及演示使用的NuGet的易用性的設置。我想解決一個示例服務。Ninject.MVC3,的NuGet,WebActivator噢,我的
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代碼。
thanksasking幫助»
** * * * * * * * * * * *更新:* * * * * * * * * * * * * * * * **
感謝關於'控制器構造函數'注入的很好迴應。 只需添加一個帶有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類創建內核,並仍享有參照「引導程序」,其作爲它的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在他的博客中討論了這個問題,這可能有助於澄清一些事情。 http://blog.ploeh.dk/2010/02/03/ServiceLocatorIsAnAntiPattern.aspx –
2011-03-23 21:32:27