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



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

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

现在,Guice 需要在Richplayer中使用ShinyCoinProvider,在PoorPlayer类中使用RustyCoinProvider

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

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

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>

试试这个:

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

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

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

最新更新