2012-06-14 58 views
0

我在注入IWindsorContainer作爲物業時遇到問題。Castle Windsor IWindsorContainer的物業注入

我正在使用MVC3。我創建了我自己的IView和ViewEngine。從視圖中我根據Windsor中註冊的類型動態構建視圖。

對於一個條件(「列表」視圖)我想顯示所有在Windsor註冊的IMyType列表。 在我的Global.asax我註冊了溫莎看法是這樣的:

container.Register(Component.For<IWindsorContainer>().Instance(container)); 

然後在我的iView實現,我宣佈一個屬性是這樣的:

public IWindsorContainer Container { get; set; } 

實際的iView是另一個組件。當我到達Render方法時,我想這樣做:

IRuleDataDefinition[] ruleDatas = Container.ResolveAll<IRuleDataDefinition>(); 

但「容器」始終爲空。是因爲我創建IView的方式(我只是使用新的,它沒有在Windsor註冊?)它是否與IWindsorContainer本身有關?還是我一切都錯了?

我也讀過其他人說,「如果你使用Container.Resolve你可能做錯了。」所以如果我做錯了,請告訴我。


編輯

也許更好的方式來短語的問題是:什麼是做container.ResolveAll()相當於當你不擁有該容器的參考的最佳方式?我需要遍歷所有註冊版本的IMyType。


編輯2ND

我把它用溫莎整個依賴鏈,這當然是你應該做的工作,我學到了。

+2

你爲什麼要這樣做? –

+0

同意@Code Jammr。繞過容器不是好習慣。 –

+0

原因當容器不能被引用時,我需要調用ResolveAll?再次,請告訴我一個更好的方法。 –

回答

3

您不應該對Container有依賴關係...這是一種反模式,它聞起來像一個服務定位器。 那麼typed factory呢?您輸入的工廠可能會根據通用界面返回給定組件的列表。

+0

沒有看過溫莎附帶的任何設施。看樣本,我不會有需要引用IKernel相同的問題,我目前需要引用IWindsorContainer? –

+0

...在這種情況下,我真的想循環遍歷在Windsor註冊的所有不同的IRuleDataDefinition類型。它似乎不是一個類型的工廠必然是我想要的。 –

+0

對不起,但有一個明確的容器/內核引用(實際上類型化的工廠爲你做,但從編碼的角度來看是隱藏的)對IoC容器原理是非常不利的違反。我想知道你是否試圖明智地設計錯誤的設計。模式違規聽起來常常是設計錯誤的標誌。 – Crixo