2014-01-22 69 views
0

我有重寫綁定PrivateModule的問題。 這裏是我的示例項目:機器人腿PrivateModule和綁定覆蓋

http://pastebin.com/3BxUT90H

所以我有3個車廂,每節得到變速器和發動機的CommonModule。

而且我將Driveline分別綁定到每輛車的註釋上,因此每輛車都獲得不同的等級。 因此標準的機器人腿問題/解決方案。

但現在讓我們假設我有10個不同的汽車,我想在一個模塊中更改引擎。 我可以從CommonModule中刪除引擎,並在所有10個模塊中定義引擎。 但更好的解決方案是重寫只有一個類的引擎綁定。

我該如何做到這一點?

如果我在Module3我bind(Engine.class).to(PetrolEngine.class);我自然得到一個綁定到引擎已配置在。

這就是爲什麼我們有Modules.override。

Injector injector = Guice.createInjector(
       commonModule, 
       module1, 
       module2, 
       Modules.override(commonModule).with(module3) 
     ); 

給了我同樣的錯誤。

那麼,有沒有一種方法來定義PrivateModule並覆蓋綁定,在AbstractModule定義?

回答

0

而是將CommonModule作爲參數傳遞給Guice.createInjector()方法,您可以將它明確安裝在每個ModuleN模塊中。

所以單詞數的定義將看起來像

class Module3 extends PrivateModule { 
    @Override 
    protected void configure() { 
     install(new CommonModule()); 
     bind(Car.class).annotatedWith(Green.class).to(Car.class); 
     expose(Car.class).annotatedWith(Green.class); 
     bind(Driveline.class).to(FourWheelDrive.class); 
    } 
} 

然後你可以指定一個模塊,它只是增加了發動機結合

class PetrolEngineModule extends AbstractModule { 
    @Override 
    protected void configure() { 
     bind(Engine.class).to(PetrolEngine.class); 
    } 
} 

Modules.override()應該工作:

Modules.override(module3).with(new PetrolEngineModule()) 

要避免將呼叫安裝在您可以創建的每個定義的模塊中bstract超類AbstractCarModule。將install()放在該模塊中,並將其用作ModuleN模塊中的每一個的超類。

+0

我不明白我用Module3重寫什麼。 如果我把模塊3中的安裝()綁定(Engine.class).to(PetrolEngine.class)我得到綁定到引擎已配置在CommonModule。 http://pastebin.com/LpZ2pWMP 我在哪裏可以重寫呢? – Steinkauz

+0

我編輯答案看起來像我真正想到的......但老實說,IMO的解決方案並不比只在每個模塊中放置特定的引擎綁定好得多(就像您最初在查詢中寫的那樣) – losipiuk