2

有人可以爲我發光一點點嗎?ASP.NET MVC3 - 使用DependencyResolver和Windsor Castle:爲什麼?

我有我的網站全部運行使用溫莎城堡。我有一個控制器工廠和控制器和服務的安裝程序。一切都很好。

現在我剛剛創建了一個帶有straigh轉發實現調用WindsorDependencyResolver一個IDependencyResolver實現類:

public class WindsorDependencyResolver : System.Web.Mvc.IDependencyResolver 
{ 
    private readonly IKernel _kernel; 

    public WindsorDependencyResolver (IKernel kernel) 
    { 
     _kernel = kernel; 
    } 

    public object GetService(Type serviceType) 
    { 
     return _kernel.Resolve(serviceType); 
    } 

    public IEnumerable<object> GetServices(Type serviceType) 
    { 
     return _kernel.ResolveAll(serviceType) as IEnumerable<object>; 
    } 
} 

我有它設置像這樣(Global.asax中):

DependencyResolver.SetResolver(new WindsorDependencyResolver(kernel)); 

現在呢?這是什麼時候用的?我應該停止使用kernel.Resolve(someType)

回答

2

我的理解是IDependencyResolver是MVC 3內部使用的服務位置/控制反轉。因此,爲了讓您的控制器正確實例化,並且能夠注入您擁有的任何依賴關係,您需要告訴MVC如何與您使用的容器(Windsor)進行對話。

當您需要從不通過構造函數/屬性注入爲您注入的容器中獲取某些內容時,仍然希望使用kernel.Resolve(someType)。

有趣的是,有關詳細信息,MSDN文檔指向IDependencyResolver上的Brad Wilson's Blog Post

+0

所以這意味着** I **不會使用DependencyResolver來處理除MVC3內部服務之外的事情嗎? – Ropstah 2011-05-29 16:36:20

+1

它的目的是讓MVC使用你選擇的容器。我想你可以自己使用它,但它是一個額外的抽象層,你可能不需要擔心你的代碼。 – ckramer 2011-05-31 17:34:46

2

這聽起來像你已經有一個自定義的IControllerFactory。如果是這樣,就堅持下去。這是一個比IDependencyResolver(which has lots of problems)黑客更好的解決方案。

+0

我之前已經閱讀過關於這方面的內容......但是遠離技術不完善之處,這裏發生了什麼?如果我註冊另一個'IDependencyResolver'實現類怎麼辦?如果DependencyResolver.SetResolver()中的容器在它們提供的服務中有重疊的話,它將如何知道使用哪一個容器? – Ropstah 2011-05-29 20:22:38

+0

-1對不起,這麼晚回覆,但我認爲Mike Hadlows的帖子的結論是錯誤的。 IDependencyResolver不打算由客戶端代碼使用,而是旨在簡化MVC的擴展。 – 2011-11-03 16:39:46

+1

如果是這樣,爲什麼有一個公共Singleton可以通過它訪問?爲什麼MVC 3被微軟吹捧爲「現在支持DI」? – 2011-11-03 17:04:49