Asp.net-Mvc

Ninject.MVC3、Nuget、WebActivator 哦,我的

  • July 23, 2011

我想設置 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&lt;ITestService&gt;();

ViewBag.Message = service.GetMessage();
返回視圖();
}

看看MVC3 中控制器的 Ninject 依賴注入

腳步:

  1. 創建一個新的 ASP.NET MVC 3 項目
  2. 從包控制台安裝 NuGet 包:Install-Package Ninject.MVC3
  3. 在 HomeController 中:
public class HomeController : Controller
{
   private readonly ITestService _service;
   public HomeController(ITestService service)
   {
       _service = service;
   }

   public ActionResult Index()
   {
       ViewBag.Message = _service.GetMessage();
       return View();
   }
}
  1. App_Start/NinjectMVC3.cs
private static void RegisterServices(IKernel kernel)
{
   kernel.Bind&lt;ITestService&gt;().To&lt;TestService&gt;();
}       

引用自:https://stackoverflow.com/questions/5315028