2014-01-24 24 views
1

我有一個Injector實例a,我想創建另一個Injector b這不一樣a,除了兩個綁定,它獲得由Module我提供覆蓋。這可能嗎?吉斯覆蓋某些綁定在現有的注射器

我知道Modules.override,但這並不需要Injector作爲參數。如果可以將Injector轉換爲Module,那可以解決我的問題。

回答

1

想這將是通過child injectors的最簡單的方法,但這是explicitly disallowed as a design decision

不支持

原因覆蓋在孩子噴射器中的結合是因爲它可以導致對編寫代碼開發人員可以在父注射器&中工作,但每個注射器都有不同的行爲。這可能會導致非常令人吃驚的情況,因爲即時(JIT)綁定以及它們與父/子注入器交互的方式。

在這一點上,我可能會考慮重組你的應用程序,以避免要求這些複雜的綁定,但如果你想走得更遠,你也許可以使用Injector.getBindings()Injector.getAllBindings()(注意區別!)它們拼合回使用Elements SPI模塊。畢竟,Binding<?>延伸Element,和Elements.getModule(...)將從您的元素創建一個模塊。我沒有檢查它的工作原理,但這可能是你最好的選擇。

+0

感謝您的提示。我會試一試。一個評論:我不認爲OP在使用「複雜綁定」。他所描述的正是在單元測試中會做什麼。當您可以有選擇地覆蓋系統的某些部分時,單元測試是最有效的。也就是說,你需要使用默認綁定,並且有一個簡單的機制可以在運行時覆蓋一個或兩個。這是標準的TDD。我是Guice的新手,也許我錯過了一些東西。然而,我看到很多開發者提出了類似的問題,我很失望Guice沒有提供這個簡單的功能。 – EJK

+1

@EJK'Modules.override'具體而且正是最好的重寫單元測試的方法,如果你需要在單元測試中注入,而我的複雜答案是回答問題的一般性質以及具體避免'Modules.override'。覆蓋注射器而不是模塊有點像從蛋白酥皮而不是雞蛋製作煎蛋,未處理的輸入會產生更好的結果。 –

+0

感謝您的澄清。我現在明白你的觀點。我希望Guice/RoboGuice文檔在這方面更清楚一點。在這個話題上似乎有很多混亂。 – EJK