2

我們使用溫莎的typed factory facility,並認爲它很可愛。我們使用interface-based factories。但是,我們希望禁用delegate-based factories的某些子集,特別是隱式註冊的工廠。這些都是違反直覺的,不是因爲它們是代表,而是因爲它們是神奇創造的,並且可以推遲失敗。可以禁用Windsor的TypedFactoryFacility的隱式委託工廠註冊嗎?

如果我們有一個類,這需要委託作爲依賴

class X { public X(Func<int,IPrincipal> d); } 

然後與已註冊的類型化的工廠設施的容器註冊。

container.Kernel.Register(Component.For<X>().ImplementedBy<X>()) 

我可以解決它沒有任何麻煩,這是違反直覺在第一,因爲沒有人告訴我們有什麼要說Func<int,IPrincipal>容器。

var x = container.Resolve<X>(); 

而我不會遇到失敗,直到我試圖實際使用該隱式創建的工廠。

x.D(0); // no registration for IPrincipal 

雖然這是有道理的,從某個角度來看,事實證明這個廠是隱含產生麻煩。這是一個非常容器感知的行爲。編寫任意類的人會發現通過代理參數化他們的行爲是有用的,一旦我們把它們放入IoC容器中,我們就會遇到這種令人驚訝的行爲。

這就是說,有一個聰明的隱含工廠似乎值得保留。現在,Windsor將爲Func<T>形式的依賴關係創建一個簡單的工廠,從而允許依賴關係的使用者延遲實際創建。在4.0框架中,將此改爲識別Lazy<T>可能是有意義的,因爲它明確表明您只是推遲構建T,而不是試圖訪問實施有趣策略的工廠。

是否有一個聰明的開關可用於配置TypedFactoryFacility還是我們需要實現一些新的對象來得到我們想要的行爲?

回答

1

如果你真的想你可以從容器中,這是創建基於委託的工廠刪除DelegateFactory組件。

相關問題