2012-09-27 8 views
1

클래스 ShinyCoinProviderRustyCoinProvider은 모두 Provider<Coin>을 구현하며 각각은 약간 다른 속성을 가진 Coin 개체를 생성합니다.Google Guice의 명시 적 공급자 바인딩

두 클라이언트 클래스 RichPlayerPoorPlayer의 또 다른 세트는 Guice 라이브러리에 자동으로 삽입 된 Coin의 인스턴스를 필요로합니다.

이제 guice는 RichplayerRustyCoinProvider에서 PoorPlayer 클래스에 ShinyCoinProvider을 사용해야합니다.

따라서 간단하면 bind().toProvider()은 충분하지 않습니다.

다른 공급자를 다른 클라이언트 클래스에 명시 적으로 바인딩하는 방법, 제공된 개체의 형식이 동일한 경우? 이 같은 @Named ("richplayer")와 Richplayer에

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

및 주석 동전 필드 :

답변

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>을 주사합니다.