Asp.net-Mvc
MVC 3 依賴解析器還是 Ninject MVC 外掛?
在 MVC 3 中,他們添加了我一直在使用的 Dependency Resolver。在回答某人對您發表評論的問題時,您應該使用 Ninject MVC 3 外掛。
所以我的問題是為什麼要使用它而不是內置的?如果這是要走的路,你如何設置它?
以上是我回答的問題的連結。
Ninject.Web.MVC 擴展(或 Ninject.MVC3 NuGet 包)也在內部使用依賴解析器。所以基本上它使用相同的機制。但是使用擴展而不是實現自己的依賴解析器有幾個原因:
- 當已經有一個完全相同的擴展時,為什麼要實現自己的依賴解析器?使用與其他實現相同的實現可以讓您在遇到問題時更輕鬆地為您提供支持。此外,使用相同的實現越多,它就越穩定。(見第 4 點)。
- 該擴展不僅僅是一個依賴解析器。有關擴展附帶的所有功能的列表,請參閱http://www.planetgeek.ch/2010/11/13/official-ninject-mvc-extension-gets-support-for-mvc3/ 。
- 預設情況下,它增加了對在請求結束後快速停用對象 InRequestScope 的支持。這可以防止負載很重的應用程序遇到 OutOfMemory 異常。
- 您文章中的依賴解析器和上面的依賴解析器都有問題。在某些負載較重的情況下,您的應用程序會崩潰,並且只顯示黃頁,直到應用程序重新啟動。我不喜歡僅僅因為使用了錯誤的依賴解析器而回答所有將來會出現的問題。將至少一個 .ToList() 添加到 GetServices
- Ninject 2.4 將移除對 InRequestScope 的支持,以移除對 System.Web 的依賴,從而減少建構目標的數量。這是一個突破性的變化。但是基於其中一個 Web 擴展的項目只需要進行非常簡單的更改即可使其再次執行。InRequestScope 仍可用於使用這些擴展之一的項目。自定義實現必須自己添加支持。
ASP.NET MVC 3 提供了一個依賴注入服務,它將掛鉤到您選擇實現的任何依賴解析器。Ninject MVC 3 外掛的功能非常簡單,因為它所要做的就是實現System.Web.Mvc.IDependencyResolver中定義的類型解析方法並呼叫適當的 Ninject 方法以返回請求的類型。
無論您選擇使用自己的 IDependencyResolver 並將其映射到 Ninject(或任何其他依賴注入框架),還是選擇使用免費提供的 Ninject MVC 3 外掛,都只是一個微不足道的區別。
下面是一個全功能範例,展示了與 Ninject 兼容的手動 IDependencyResolver 的外觀。Ninject MVC 3 外掛基本上非常相似:
public class NinjectDependencyResolver : IDependencyResolver { private readonly IKernel _kernel; public NinjectDependencyResolver(IKernel kernel) { _kernel = kernel; } public object GetService(Type serviceType) { return _kernel.TryGet(serviceType, new IParameter[0]); } public IEnumerable<object> GetServices(Type serviceType) { return _kernel.GetAll(serviceType, new IParameter[0]); } }這裡的關鍵是ASP.NET MVC 沒有提供成熟的依賴注入框架;它僅提供在整個 ASP.NET MVC 請求管道(控制器解析、視圖解析等)的特定點通過 IoC 容器(即 Ninject)檢索所需類型實例所需的層。
注意:如果我使用的任何術語不太準確,請告知我。