2012-04-26 19 views
1

我即將開始使用Windsor的一個新項目,但我一直想知道如何運行到A類可能需要實例化B類的場景,但對於Windsor來說不可行或不可能注入Class的實例B進入它。我努力想想一個場景,但這裏有:溫莎城堡 - 我應該參考其他課程的容器嗎?

說我有一個企業實體「客戶」,傳遞給WCF服務。這個類有一個Ent.Lib自我驗證方法,它依次使用一個輔助類「CustomerValidator」。由服務接收的Customer對象已被WCF反序列化,所以Windsor在其實例化中不起作用,所以我不能注入任何依賴關係。我也不能將我的CustomerValidator傳遞給自我驗證方法,因爲它必須遵循Ent.Lib的特定簽名。那麼我怎麼能在這個類/方法中實例化CustomerValidator呢?我仍然想利用Windsor而不是簡單地做一個「var cv = new CustomerValidator();」。

這不是一個很好的例子,因爲它可以通過不同的方式解決,例如,將Customer對象傳遞給驗證方法,而不是在Customer類中使用驗證方法,但它提供了一個可供討論的場景。

我可以將我的WindsorContainer公開爲公共單體,可以通過任何需要它的代碼進行訪問,但這似乎令人不悅。還有其他建議嗎?

回答

2

我應該引用其他類的容器嗎?

不。通過引用容器,您可以向類中添加複雜且不必要的依賴項,這會使測試複雜化並增加複雜性。

服務收到的Customer對象已被WCF反序列化,所以Windsor在其實例化中沒有參與,所以我不能注入任何依賴關係。

我覺得這是你應該去,探索嘗試,如果實在是沒有任何辦法採取反序列化的控制,因此您可以注入的依賴關係的方向。

如果失敗,請考慮使用 http://commonservicelocator.codeplex.com/。其微軟的服務位置實施與溫莎適配器可用。它與引用容器的模式基本相同,但不引入對特定容器實現的依賴。另外,我認爲模擬測試會更容易。

+2

CommonServiceLocator是一個痛苦的屁股,它的靜音點;無論如何不依賴於特定的IoC,因爲現在你不僅僅依賴ONE,而是依賴於兩個「IoC」容器。另外,在檢查沒有被pnp修復的非初始化CSL單例時,存在一個長期的錯誤。看來你可以[鉤入WCF某處](http://msdn.microsoft.com/en-us/magazine/cc163302.aspx)。此外,CSL代碼不會調用「Release」,如果沒有非跟蹤的Windsor策略,您將以這種方式繼續參考所有已解析的對象。 – Henrik 2012-04-26 21:11:33

+0

好點,我確實考慮過不提CSL或SL,現在我知道爲什麼 – 2012-04-26 21:37:34