1

ShinyCoinProviderRustyCoinProvider两者都实现Provider<Coin>并且每个都产生一个Coin具有略微不同属性的对象。

另一组两个客户端类RichPlayer,需要一个由 Guice 库自动注入PoorPlayer的实例。Coin

现在 Guice 需要ShinyCoinProvider在课堂RichplayerRustyCoinProvider使用。PoorPlayer

因此简单,bind().toProvider()在这里还不够。

如何将不同的提供者显式绑定到不同的客户端类,其中提供的对象是相同类型的?

4

2 回答 2

3

Turtledove的答案称为带注释的绑定,如果您可以控制 RichPlayer 和 PoorPlayer,这将很有意义。它还使您能够从同一类中请求闪亮的硬币和生锈的硬币。但是,如果您愿意,您也可以使用私有模块

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>.

于 2012-09-29T23:13:53.663 回答
2

试试这个:

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

并在 Richplayer 中使用 @Named("richplayer") 注释 Coin 字段,如下所示:

@Inject
@Named("richplayer")
private Coin coin;
于 2012-09-27T08:29:23.043 回答