Google Guice中的显式提供程序绑定

时间:2012-09-27 08:21:59

标签: java android guice

ShinyCoinProviderRustyCoinProvider都会实现Provider<Coin>,每个类都会生成一个属性略有不同的Coin对象。

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

现在,Guice必须在ShinyCoinProvider中使用Richplayer,在RustyCoinProvider类中使用PoorPlayer

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

如何明确地将不同的提供程序绑定到不同的客户端类,其中提供的Object具有相同的类型?

2 个答案:

答案 0 :(得分:2)

试试这个:

bind(Coin.class).annotatedWith(Names.named("richplayer")).toProvider(ShinyCoinProvider.class)
使用@Named(“richplayer”)的Richplayer中的

和注释Coin字段如下:

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

答案 1 :(得分:2)

turtledove 的答案被称为带注释的绑定,如果您拥有对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>