2011-03-15 90 views
14

我想設置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>(); 
    } 
} 
+5

這當然是意見的問題,但您的NinjectMVC3.Resolve 靜態方法是服務定位器反模式的一個示例。一般來說,依賴注入應該是一個「告訴,不要問」的東西。 Mark Seemann在他的博客中討論了這個問題,這可能有助於澄清一些事情。 http://blog.ploeh.dk/2010/02/03/ServiceLocatorIsAnAntiPattern.aspx – 2011-03-23 21:32:27

回答

4

添加ITestService作爲構造參數到控制器:

private ITestService service; 

public MyController(ITestService service) 
{ 
    this.service = service; 
} 

public ActionResult Index() 
{ 
    ViewBag.Message = this.service.GetMessage(); 
    return View(); 
} 

Ninject自動注入ITestService到控制器中。然後使用Index方法中的服務字段。


另外,如果你不想Ninject注入到你的控制器構造,可以保持周圍創建了內核,那麼你的指數方法裏面,你調用內核。獲取<ITestService>()抓住一個實例:

public ActionResult Index() 
{ 
    var kernel = ... // Go grab the kernel we created back in app startup. 
    ITestService service = kernel.Get<ITestService>(); 

    ViewBag.Message = service.GetMessage(); 
    return View(); 
} 

看一看Ninject dependency inject for controllers in MVC3

+0

感謝你,這是有道理的。現在保持內核的好習慣是什麼?使用單身作爲全球商店? – Rob 2011-03-15 17:29:47

+1

就我個人而言,我有一個名爲Dependency的靜態類,只有一個方法:Get 。這在內部調用內核的Get方法。使用代碼然後看起來像:依賴。獲取() – 2011-03-15 18:57:06

+0

再次感謝resposne。 – Rob 2011-03-16 18:09:01

16

步驟:

  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(); 
        } 
    } 
    
  4. App_Start/NinjectMVC3.cs

    private static void RegisterServices(IKernel kernel) 
    { 
        kernel.Bind<ITestService>().To<TestService>(); 
    }  
    
+0

謝謝你,看起來很直截了當。現在保持內核的好習慣是什麼?使用單身作爲全球商店? – Rob 2011-03-15 18:02:48