代码之家  ›  专栏  ›  技术社区  ›  s.d

Google Guice中的显式提供者绑定

  •  1
  • s.d  · 技术社区  · 12 年前

    课程 ShinyCoinProvider RustyCoinProvider 两个机具 Provider<Coin> 并且每个都产生 Coin 属性略有不同的对象。

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

    现在Guice需要使用 新币提供商 在里面 Richplayer RustyCoinProvider公司 在里面 穷人 类。

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

    如果提供的Object类型相同,如何将不同的提供程序显式绑定到不同的客户端类?

    2 回复  |  直到 12 年前
        1
  •  3
  •   Jeff Bowman    12 年前

    斑鸠 的答案叫做 带注释的绑定 如果您可以控制您的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>

        2
  •  2
  •   turtledove    12 年前

    试试这个:

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

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

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