Ninject.MVC3、Nuget、WebActivator 哦,我的
我想設置 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 方法,但不確定。
** * * * * * * * * * * (最終)更新: * * * * * * * * * * * * * * **
再次感謝您的回答和評論……
更正: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>(); } }
將 ITestService 作為建構子參數添加到您的控制器:
私有 ITestService 服務; 公共 MyController(ITestService 服務) { this.service = 服務; } 公共行動結果索引() { ViewBag.Message = this.service.GetMessage(); 返回視圖(); }Ninject 會自動將 ITestService 注入到您的控制器中。然後使用 Index 方法中的 service 欄位。
或者,如果您不希望 Ninject 注入到您的控制器建構子中,您可以保留您創建的核心,然後在您的 Index 方法中,您呼叫 kernel.Get<ITestService>() 來獲取一個實例:
公共行動結果索引() { var kernel = ... // 獲取我們在應用啟動時創建的核心。 ITestService 服務 = kernel.Get<ITestService>(); ViewBag.Message = service.GetMessage(); 返回視圖(); }
腳步:
- 創建一個新的 ASP.NET MVC 3 項目
- 從包控制台安裝 NuGet 包:
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>(); }