2008-10-07 16 views
10

當實例化一個類時,Windsor默認將該類的所有公共屬性視爲可選依賴項,並試圖滿足它們。在我的情況下,這會創建一個相當複雜的循環依賴關係,導致我的應用程序掛起。溫莎集裝箱:如何指定一個公共財產不應該由容器填充?

我怎樣才能明確告訴溫莎城堡它不應該試圖滿足公共財產?我假設必須有這樣的屬性。我找不到它,所以請讓我知道適當的命名空間/程序集。

如果有任何方法可以不使用屬性(如Xml Configuration或通過代碼進行配置)來完成此操作,那麼會更好,因爲發生此事的特定庫至今不需要依賴Castle。

+0

將此問題添加到Windsor常見問題解答中:http://using.castleproject.org/display/IoC/FAQ – 2010-01-24 17:14:33

回答

11

可以使用Castle.Core.DoNotWireAttribute屬性由IoC容器被有線了停止特性(這是Castle.Core程序集,這意味着你的庫只需要依賴輕量級的Castle.Core程序集 - 例如,如果你想使用c在沒有控制容器的情況下,或者在不同的IoC容器中)。

我不相信有什麼辦法可以防止接線從XML配置發生,但它是相當容易地添加這種支持 - 如果我不得不這樣做,我可能會:

  1. 引入某種屬性對屬性聲明中的XML:< myprop絲=「假」/>
  2. 繼承PropertiesDependenciesModelInspector,重寫InspectProperties方法一些額外的邏輯適用於識別哪些屬性應該作爲依賴關係添加到組件模型中(檢查模型。wire =「false」屬性/值對的配置)。
  3. 繼承DefaultComponentModelBuilder和覆蓋InitializeContributors包括您更換PropertiesDependenciesModelInspector - 或者只是刪除現有的性能貢獻者,在運行時通過AddContributor/RemoveContributor方法添加你自己的。
  4. 替換分​​配給容器內核的服務實例的ComponentModelBuilder

可以爲你工作的另一種方法是在請求服務的任何實例之前手動刪除模型中的依賴關係,即,

kernel.GetHandler(typeof(MyComponent))。ComponentModel.Dependencies.RemoveAll(d => d。DependencyKey ==「PropertyThatShouldNotBeired」);

雖然YMMV採用這種方法 - 尤其是如果您有可啓動的服務或其他可能在註冊後急需實例化您的組件的設施。

+0

該代碼示例在2.5.x中不起作用 - RemoveAll()方法已消失。有其他選擇嗎? – 2011-08-02 12:14:01

+0

P.S.我正在使用流暢的註冊API。 – 2011-08-02 14:06:59

2

我不知道哪個城堡,你的版本當時人們正在使用,但沒有提到的解決方案正在工作。另外,還有很多死鏈接。

與城堡3.1,這裏的解決方案,我想出了(由於一些城堡的源代碼挖掘):

container.Register(Component.For(type) 
             .LifestyleTransient() 
             .Properties(propertyInfo => propertyInfo.PropertyType != typeof(MyOtherType))); 

的「屬性」功能將構建ComponentModel時所使用的城堡屬性過濾器。在我的情況下,除了屬性類型'MyOtherType'外,所有的屬性依賴都會被滿足。