2012-04-05 123 views
0

在Kozmic的博客(2009年)上,他建議通用工廠從容器中檢索物體。那麼,這對我來說就像是一個僞服務定位器。所以我想問一下這裏的專家的意見。Castle Windsor Generic Typed Factory

public interface IGenericFactory 
    { 
     T Create<T>(); 
    } 

我可以用它從Windsor容器中取物件嗎?這種方法有什麼缺點嗎?

更新:

其實,我想用它來獲取我不想創建多個工廠只有幾個瞬間。所有這些場景都有一個工廠。

回答

1

我做了快速谷歌搜索,發現這篇文章,你可能指的是:http://kozmic.pl/2009/12/23/castle-typed-factory-facility-reborn/

如果是這樣的話,那麼基耶斯洛夫Koźmic說,它自己:

[...]你可以用它來建立一個通用服務定位器

是的,現在Service Locator is considered to be an anti-pattern

但是,文章是關於例外的情況。筆者把它相當清楚地第一段:

使用IoC容器時,一般的經驗法則是 - 當你在你的組件引用您的容器(外的任何地方你的引導代碼)你這樣做錯誤。與所有規則一樣,有例外,但它們很少見。

+0

@ w0lf-使用通用工廠方法,我不必在我的代碼中引用容器。我把它註冊爲一個打字工廠和繁榮。注入工廠並獲得您想要的任何東西! (實際上,我想用它來獲取我不想創建多個工廠的幾個瞬變)。我想確定這是好事還是壞事? – user1178376 2012-04-18 21:45:51

+0

@ user1178376該方法的問題在於它實際上是一個抽象服務定位器,可以輕鬆隱藏類的依賴關係。爲了避免這種情況及其引起的維護問題,請嘗試使用普通的構造函數注入和專門的工廠。 – GolfWolf 2012-04-19 07:02:20

+1

另請注意Nicholas Blumhardt的評論。他非常清楚地描述了這一點:「它可以嘗試創建字面上的任何東西 - 這會使維護和測試變得更加困難。」 – Steven 2013-07-12 11:45:07

1

相反,考慮以下因素:

public interface IGenericFactory<out T> 
{ 
    T Create(); 
} 

接口只需要創建一次,但必須注射每次需要解決的服務。這樣,它不是一個通用的服務定位器(這是一個反模式,正如前面提到的w0lf)。

加分點:

普通的依賴注入,需要在你的依賴關係圖中的所有服務都可以解決。 IGenericFactory<>將通過打字的工廠設施自動解決。但是它的泛型類型參數在執行Create()之前不會被解決。

如果這種情況發生在程序深處的邊緣情況下,並且您忘記註冊該服務,那麼在生產之前您可能沒有意識到該錯誤。

解決的辦法是編寫一個IGenericFactory<>的自定義解析器,它檢查泛型類型參數是否有一個處理程序,並且它沒有等待任何依賴項被註冊。有關自定義解析器的信息在這裏:http://docs.castleproject.org/Windsor.Resolvers.ash