我們使用溫莎的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
還是我們需要實現一些新的對象來得到我們想要的行爲?