2012-12-10 47 views
0

這是我的代碼(只是一個例子,當然):配置Java對象結構,無需依賴注入

Employee manager = new DefaultEmployee(/* dependencies */); 
Budget budget = new DefaultBudget(/* dependencies */); 
Project project = new DefaultProject(manager, budget); 

DefaultProject取決於EmployeeBudget,他們依靠別的東西,等等等等的層次依賴關係相當大(可能是上百種類型)。我可以硬編碼(如示例中所示),或者我可以使用某種配置(XML或YAML)和一些可以在運行時創建此類層次結構的構建器。除了Spring Framework之外,還有其他解決方案嗎?

請不要提供依賴注入。

此片段與dependency injection設計模式無關,因爲消費者沒有任何鏈接到容器。此外,根本沒有容器(這是DI模式的靜態組件,並且是對OOP原則的粗暴違反),並且沒有inversion of control

+0

我會在這種情況下使用依賴注入。只是好奇你爲什麼不? – Subin

+4

爲什麼不是DI?你正在做的事實上是依賴注入,手工製作。 Spring(或者像Guice這樣的其他DI框架)正在按照你的要求進行操作,如果你能說出爲什麼你對DI說「不」,這將是一件好事。 (你正在做DI,並尋找一個框架來做DI,但你不想要DI框架......:P,這對我來說聽起來很奇怪) –

+1

你描述的**是**(手動)依賴注入! – assylias

回答

0

您可以創建一個ObjectFactory,它提供了一個方法<T> T getInstance(T Interface)

工廠然後查找您已經通過的接口的實現,實例化並返回它。 ObjectFactory考慮它實例化的對象的構造函數來查找進一步的實現。這是相當多的思考,但工程,我已經在一個項目中使用它。

在你的榜樣,你將不得不調用

Project project = objectFactory.getInstance(Project.class); 

ObjectFactory找到實現(DefaultProject),並認爲,構造函數需要一個EmployeeBudget。因此,在實例化DefaultProject之前,它會查找這些實現(DefaultEmployeeDefaultBudget)並實例化它們。你必須在這裏使用遞歸。

+0

如果我在同一工廠有多個相同接口的實現,該怎麼辦? – yegor256

+0

您應該添加一種方法來告訴ObjectFactory哪些實現應該用於接口。這可以通過專門的工廠來完成,例如'DefaultObjectFactory'或'ExternalObjectFactory',它擴展了ObjectFactory。 – Kai

+0

沒錯,但我正在尋找一個現有的開源框架,可以自動化所有這些 – yegor256