2012-09-27 65 views
1

ShinyCoinProviderRustyCoinProvider都執行Provider<Coin>並且每個產生具有略微不同屬性的​​對象。在Google Guice中顯式提供程序綁定

另一組兩個客戶類RichPlayerPoorPlayer需要自動注入Guice庫的​​的實例。

現在,Guice需要使用ShinyCoinProvider中的RichplayerRustyCoinProvider中的PoorPlayer類。

因此很簡單,bind().toProvider()在這裏是不夠的。

如何將不同的提供程序顯式綁定到不同的客戶端類,其中提供的Object的類型是否相同?與@Named( 「richplayer」)這樣的

bind(Coin.class).annotatedWith(Names.named("richplayer")).toProvider(ShinyCoinProvider.class) 

和註釋硬幣場Richplayer:

回答

2

試試這個

@Inject 
@Named("richplayer") 
private Coin coin; 
+0

謝謝。我很困惑,'@ Named'只在被定義時用於標識類。將嘗試此解決方案。 –

2

斑鳩的答案被稱爲註釋綁定並且如果您可以控制您的RichPlayer和PoorPlayer,則具有很大的意義。它還使您能夠請求閃亮的硬幣和來自同一班級的生鏽硬幣。但是,如果您想要,也可以使用private modules

class CoinModule extends AbstractModule { 
    @Override public void configure() { 
    install(new PrivateModule() { 
     @Override public void configure() { 
     bind(Coin.class).toProvider(ShinyCoinProvider.class); 
     bind(RichPlayer.class); 
     expose(RichPlayer.class); 
     } 
    }); 
    install(new PrivateModule() { 
     @Override public void configure() { 
     bind(Coin.class).toProvider(RustyCoinProvider.class); 
     bind(PoorPlayer.class); 
     expose(PoorPlayer.class); 
     } 
    }); 
    } 
} 

基本上,這種安裝兩個匿名內部模塊,每個模塊結合不同播放器,因此,即使沒有註釋,RichPlayer 和RichPlayer的任何相關性,它的依賴等將全部採用ShinyCoinProvider的任何依賴性。與PoorPlayer和RustyCoinProvider一樣。這可能比註釋綁定稍微難一些,但也可能稍微強一點 - 也許從這裏可以減少RichPlayer和PoorPlayer使用相同的具體類,或創建一個CoinPurse類,這兩個播放器實現使用簡單地注入Provider<Coin>

相關問題