2011-05-03 55 views
7

我已經添加了CollectionResolver作爲我的溫莎核心的子解析器,它會妥善解決上物體注入依賴的集合。也就是說,如果我有Castle Windsor CollectionResolver:爲什麼它不適用於Resolve調用?

class X { public X(IComponent[] components) { ... } } 
container.Register(/* lots of IComponents */); 
container.Register(Component.For<X>()); 

當我解決components參數構造函數是正確構造它

container.Resolve<X>() 

但如果相反,我只是想獲得部件本身的列表,

container.Resolve<IComponent[]>() 

我得到一個ComponentNotFound例外抱怨我沒有註冊的任何組件IComponent[]。我發現這種不對稱有悖常理,因爲我不知道爲什麼,內核應該採取不同的時,它是解決它的構造函數/屬性中找到的依賴時相比,它是解決到依賴性它的用戶會喜歡它來解決。

回答

8

Resolve/ResolveAll的明確劃分歸因於容器中內部和無趣的實現細節。收集分解爲子depenendcy解析器,因此它僅適用於依賴。

我同意這是不是真的直觀。隨意在Windsor的問題跟蹤器中記錄一張關於它的票。

+2

「我同意這是不是真的不直觀。」我認爲你的意思是說這不是很直觀。 – Steven 2011-05-03 10:43:15

+1

是的,謝謝 – 2011-05-03 11:04:38

0

我想這種現象的原因是,在構造函數或財產注入城堡採用集散/數組符號爲所有的實現應該在集合中返回的指標。否則,你需要一個特殊的界面或屬性來告訴它。然後你將不得不明確參考城堡的集會。

但是,直接從容器中解析時,實際上是指定需要解析的類型,並且可以更具表達性(使用API​​),您可以明確地調用ResolveAll。所以我猜這是一個設計上的妥協 - 實現IoC容器並不那麼簡單,因爲你經常受到語言結構的束縛。

相關問題