4

Do I need to create a new module with the Interface bound to a different implementation?

Chef newChef = Guice.createInjector(Stage.DEVELOPMENT, new Module() {
     @Override
      public void configure(Binder binder) {
        binder.bind(FortuneService.class).to(FortuneServiceImpl.class);
      }

    }).getInstance(Chef.class);

Chef newChef2 = Guice.createInjector(Stage.DEVELOPMENT, new Module() {
  @Override
  public void configure(Binder binder) {
    binder.bind(FortuneService.class).to(FortuneServiceImpl2.class);
  }

}).getInstance(Chef.class);

I cannot touch the Chef Class nor the Interfaces. I am just a client binding to Chef's FortuneService to different Interfaces at runtime.

4

3 回答 3

8

Take 看起来像Guice FAQ 中描述的Robot Legs部分。“如何创建一个有两个 Leg 对象的机器人,左边一个注入了 LeftFoot,右边一个注入了 RightFoot。” 但只有一个 Leg 类在两种情况下都被重用。

有一个 PrivateModules 解决方案。它使用两个独立的私有模块,一个@Left 和一个@Right。每个都有一个未注释的 Foot.class 和 Leg.class 的绑定,并公开了一个带注释的 Leg.class 的绑定:

class LegModule extends PrivateModule {
  private final Class<? extends Annotation> annotation;

  LegModule(Class<? extends Annotation> annotation) {
    this.annotation = annotation;
  }

  @Override protected void configure() {
    bind(Leg.class).annotatedWith(annotation).to(Leg.class);
    expose(Leg.class).annotatedWith(annotation);

    bindFoot();
  }

  abstract void bindFoot();
}

...并将它们粘合在一起:

  public static void main(String[] args) {
    Injector injector = Guice.createInjector(
        new LegModule(Left.class) {
          @Override void bindFoot() {
            bind(Foot.class).toInstance(new Foot("leftie"));
          }
        },
        new LegModule(Right.class) {
          @Override void bindFoot() {
            bind(Foot.class).toInstance(new Foot("righty"));
          }
        });
  }
于 2010-05-09T23:15:27.247 回答
3

您如何决定 Chef 需要哪个 FortuneService 实现?如果 Guice 无法区分这两者,您就不能将相同的接口绑定到不同的实现。你必须使用这样的东西。

bind(FortuneService.class).annotatedWith(Names.named("1").to(FortuneServiceImpl.class);
bind(FortuneService.class).annotatedWith(Names.named("2").to(FortuneServiceImpl2.class);

有关更多信息,请参见此处

于 2010-05-09T03:13:27.877 回答
0

我认为您可以使用@Provides注释。见这里

于 2010-05-08T21:08:39.827 回答