2011-05-03 39 views
1

如果我爲相同的服務註冊兩個組件,例如當我嘗試解決多個註冊的單個組件時,是否可以讓Castle Windsor投訴?

container.Register(
    Component.For<IThing>.ImplementedBy<Thing1>(), 
    Component.For<IThing>.ImplementedBy<Thing2>()) 

我覺得很奇怪,如果我ResolveIThing的依賴或要求其手動解決,溫莎就乾脆挑一個給我(第一或Thing1,它出現)。

我理解這可能是有益的在某些情況下,讓一個註冊爲「覆蓋」另一個通過獲取先在註冊組件列表。

是否有指定當IThing服務單獨解決的是一個例外,應在這種情況下拋出的方法嗎?

回答

3

是的,溫莎將默認使用第一個組件作爲默認對於任何給定的服務,它不扔,但那樣工作是在一些先進的情況下使用像裝飾,責任鏈模式的一個非常強大的功能。

你會在這些案件中拋出什麼理由?

無論如何,如果你真的相信這是你想要什麼,我會寫一個測試,抓住所有的處理程序,從容器

container.Kernel.GetAssignableHandlers(typeof(object)) 

然後你就可以對其進行檢查,看看是否有Service暴露由不止一名經理人處理並據此採取行動。

+0

我擔心的是開發人員可以很容易地指定他想要一個IThing或多個IThings(例如IThing [])。我們可能會從第三方加載插件,並且他們要安裝自己的IThing處理程序,我們可能有一個難以診斷的情況,他們在想「爲什麼我的IThing不能使用」。如果配置遭到破壞,我們認爲這是一項全球服務,事實上正在爭奪,這將是一個問題。如果我理解正確,你的測試將阻止用戶獲得IThing []集合。 – 2011-05-03 15:07:56

+0

該測試會做你告訴它。您可以爲集合添加特殊情況 – 2011-05-04 03:05:32

0

您可以創建一個IHandlerSelector的實現,該實現對解析IThing s有意見,如果您的IThing服務有多個處理程序可用,則會拋出。

你可以閱讀更多關於處理程序選擇here

的處理器選擇可以在開發過程中進行註冊,才避免任何生產:)會超過必要的錯誤

另一種策略,這是一個我通常遵循,是建立一個連接的時裝載自動化測試在所有可能的配置(環境/客戶)容器中,然後做一些斷言。

假設您的集裝箱滿載,像

Assert.That(container.ResolveAll<IThing>(), Has.Length.EqualTo(1)); 

就足夠了。

+0

'IHandlerSelector's不會滿足您描述的要求。他們交給所有可分配的處理程序,而不僅僅是爲請求類型明確註冊的處理程序,所以您需要考慮這一點。否則,合理的做法,雖然我寧願在測試中做到這一點快速失敗。 – 2011-05-03 10:26:25

相關問題