2011-11-23 58 views
2

我想就如何爲具有下述結構的系統構造依賴注入的最佳方法提出一些建議和反饋。我使用的是Guice,因此寧願以基於註解的聲明爲中心的解決方案,而不是XML重型的Spring風格的配置。依賴注入的正確結構(使用Guice)

考慮一組類似的對象Ball, Box, and Tube,每個對象都依賴於Logger,通過構造函數提供。 (這可能並不重要,但所有四個類別碰巧都是單例 - 應用程序,而不是四人幫,多種。)

A ToyChest類負責創建和管理三個形狀對象。 ToyChest本身不依賴於Logger,除了創建形狀對象。

ToyChest類被實例化爲Main類中的應用程序單例。

我對構建ToyChest中形狀的最佳方法感到困惑。我要麼(1)需要訪問Guice Injector實例已附加到Module綁定Logger實施或(2)需要創建一個新的Injector附加到正確的Module

(1)通過添加@Inject Injector injectorToyChest完成,但這種感覺怪怪的,因爲ToyChest實際上並沒有任何直接的依賴---只有那些它實例的孩子。 (2),我不知道如何通過適當的Module

我在正確的軌道上嗎?有沒有更好的方法來構造這個?

對此question的回答提到通過Provider而不是直接使用噴射器,但我不確定應該如何工作。

編輯:

也許更簡單的問題是:使用吉斯時,這裏是構建形狀的物體的適當位置? ToyChest會與他們做一些配置,但我想他們可以在別處構建。 ToyChest(作爲管理它們的容器),而不是Main,在我看來,就像構建它們的適當位置。

+0

Ball,Box和Tube都是應用程序單例,但它們是由ToyChest創建的?你能澄清爲什麼需要這樣嗎? ToyChest可以在建造時分配給他們嗎? –

+0

1)ToyChest決定創建哪個。 2)他們可以通過構造函數傳遞給ToyChest,但在其他地方不需要它們。這樣(在我看來)會不必要地使構造者複雜化。還有一個全烏龜的問題。是什麼使他們傳遞給ToyChest?也許通過構造函數傳遞它們是正確的,我只是沒有看到更大的結構。 –

回答

3

正確的方法是讓guice構造你的依賴關係。這是創建和配置。

在你的情況下,你應該在Main構建一個注入器。從注射器你得到ToyChest。當您通過由Guice管理的注入器獲取ToyChest並且您可以依靠它來提供正確配置的所有依賴關係。

對於您的情況,您可以在ToyChest中注入Provider<Ball>,Provider<Box>等,並在需要時從供應商處檢索實例。 ToyChest不負責構造實例,只是爲了使用它。如果您有插件架構,您還可以檢查MapBinder

到目前爲止一切都是由guice管理的,所以這些形狀可以讓他們的記錄器注入,而無需使用類知道它。

如果您有一些運行參數要傳遞給新創建的形狀實例,則可以使用AssistedInject

只是一個提示:你不需要使用構造函數注入,你可以注入字段或設置器,這簡化了構造函數。

+0

謝謝,這支持了我提出這個問題後得出的結論,並提出了一些其他的選擇。 ToyChest需要通過構造函數/設置器來接受形狀,或者接受從中獲取形狀的工廠/提供者/映射綁定者。我認爲我的掛斷是在顛倒我的控制權! –