4

別の実装にバインドされたインターフェイスを使用して新しいモジュールを作成する必要がありますか?

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);

Chefクラスにもインターフェースにも触れられません。私は、実行時にChefのFortuneServiceをさまざまなインターフェイスにバインドするクライアントです。

4

3 に答える 3

8

テイクは、GuiceFAQで説明されているRobotLegsセクションのように見えます。「2つのLegオブジェクトを使用してロボットを作成する方法。左側のオブジェクトにはLeftFootを注入し、右側のオブジェクトにはRightFootを注入します。」ただし、両方のコンテキストで再利用されるLegクラスは1つだけです。

PrivateModulesソリューションがあります。@Leftモジュールと@Rightモジュールの2つの個別のプライベートモジュールを使用します。それぞれに、注釈のない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が2つを区別する方法がなければ、同じインターフェースを異なる実装にバインドすることはできません。このようなものを使用する必要があります。

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 に答える