4 Stimmen

Wie binde ich verschiedene Schnittstellen mit Google Guice?

Muss ich ein neues Modul erstellen, bei dem die Schnittstelle an eine andere Implementierung gebunden ist?

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

Ich kann weder die Chef Class noch die Interfaces anfassen. Ich bin nur ein Client, der sich zur Laufzeit an den FortuneService von Chef an verschiedene Schnittstellen bindet.

8voto

Jesse Wilson Punkte 36213

Die Aufnahme sieht aus wie die Roboter-Beine Abschnitt, beschrieben in den Guice FAQ. "Wie man einen Roboter mit zwei Bein-Objekten erstellt, wobei das linke mit einem LeftFoot und das rechte mit einem RightFoot injiziert wird." Aber nur eine Leg-Klasse, die in beiden Kontexten wiederverwendet wird.

Es gibt eine PrivateModules-Lösung. Sie verwendet zwei getrennte private Module, ein @Left und ein @Right Modul. Jedes hat eine Bindung für die unkommentierte Foot.class und Leg.class und stellt eine Bindung für die kommentierte Leg.class zur Verfügung:

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

...und um alles zusammenzufügen:

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

3voto

Kartik Punkte 2357

Wie entscheiden Sie, welche FortuneService-Implementierung für Chef benötigt wird? Sie können dieselbe Schnittstelle nicht an verschiedene Implementierungen binden, ohne dass Guice eine Möglichkeit hat, zwischen den beiden zu unterscheiden. Sie müssen etwas wie dieses verwenden.

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

Weitere Informationen finden Sie unter ici

0voto

Bozho Punkte 570413

Ich denke, Sie können die @Provides Bemerkung. Siehe ici .

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X