Frage

Ich habe ein WebApp, mit dem GIN Abhängigkeiten am Einstiegspunkt injizieren.

private InjectorService injector = GWT.create(InjectorService.class);

@GinModules({PlaceContollerInject.class, RootViewInject.class})
public interface InjectorService extends Ginjector {

  RootView getRootView();
  PlaceController getPlaceConroller();

}

public class RootViewInject extends AbstractGinModule {

  @Override
  protected void configure() {
    bind(RootView.class).to(RootViewImpl.class);
  }
}

Ich brauche eine mobile Version, die eine unterschiedliche RootView -Implementierung verwendet. Abhängigkeiten werden im folgenden Modul beschrieben

public class RootViewMobileInject extends AbstractGinModule {

  @Override
  protected void configure() {
    bind(RootView.class).to(RootViewMobileImpl.class);
  }
}

Die Frage ist, wie Sie die erforderliche Abhängigkeit bedingt auswählen, ob wir eine mobile oder Standardversion benötigen. Ich habe gesehen GWT-in Mehrere Implementierungen, aber diese Lösung nicht herausgefunden hat, da der Anbieter die Kette der Abhängigkeiten durchbricht und das Werksmuster die Prüfbarkeit bricht. In "Big Modular Java with Guice" Video hier (12 Minuten) Der Injektor von Guice in Module wurde als Ersatz für Fabriken dargestellt. Meine Frage ist also, ob ich einen anderen Ginjector für mobile und Standardversionen (wie Mobilfabrik und Standardfaktor) meiner App erstellen oder es wäre eine schlechte Praxis, und ich sollte eine Instanz von Ginjector mit allen benötigten Versionen konfigurieren. Zum Beispiel mit den Anmerkungsbindungen wie dieser.

public class RootViewMobileInject extends AbstractGinModule {

  @Override
  protected void configure() {
    bind(RootView.class).annotatedWith(Mobile.class).to(RootViewMobileImpl.class);
  }
}

und verwenden Sie @Mobile -Annotated -Bindungen am GWT -Einstiegspunkt

  @Inject
  private void setMobileRootView(@Mobile RootView rw) {
    this.rw = rw;
  }

In einem solchen vereinfachten Beispiel wie oben kann es möglich sein. Wenn eine Anwendung jedoch über mehr Abhängigkeiten verfügt, die mobile und Standardversionen benötigen. Es sieht nach untestbarem "hässlichen" (wie in der Präsentation von Guice) Fabriken aus. Entschuldigung für mein Englisch. Jede Hilfe wird geschätzt.

War es hilfreich?

Lösung

Ich glaube, Sie möchten die GWT-aufgeschobene Bindung verwenden, indem Sie je nach Benutzer-Agent eine andere Version Ihres InjectorService binden. Dadurch wird sichergestellt, dass die mobile Version nur über die mobilen Implementierungen zusammengestellt (und heruntergeladen wird).

Sie hätten also InjectorServicedesktop, InjectorServicemobile, die beide von InjectorService, dann von GWT.Create (InjectorService.Class) aus erstrecken, und die aufgeschobene Bindung entscheiden lassen, welche Implementierung sie verwenden soll.

http://code.google.com/webbtoolkit/doc/latest/devguidecodingbasicsDeferred.html#replacement

Eine Instanz von Ginjector mit allen Versionen scheint schlecht zu sein, da alle Code für beide Versionen immer heruntergeladen werden (und Sie möchten sicherlich nicht alle Ihre Desktop -Ansichten in Ihre mobile App herunterladen).

Bearbeiten: Wie Thomas in den Kommentaren betont, müssen Sie jeden Injektorservicexxx in eine einfache Halterklasse einfügen, die GWT.Create () der Injektorservicexxx ist, und verwenden Sie den Ersatz, um zwischen den Inhabern zu wechseln.

Andere Tipps

Das zu tun, was Sie wollen, ist eigentlich ziemlich kompliziert, da Ihre gemeinsame Injektorschnittstelle, die mit Ihrem GIN -Modul kommentiert wird, nicht auf ein abstraktes GIN -Modul hinweisen kann. Das Gin -Modul, auf das Ihre Ginjector -Schnittstelle vermittelt wird, muss ein konkreter sein. Ein konkretes Modul kann mehrere Konfigurationen nicht gleichzeitig erfüllen.

Sie tun also: (a) Erstellen Sie Ihre Ginjector -Schnittstelle, sagen Sie Clientginjector und Ihr Modul Clientmodule für eine Desktop -Anwendung.

(b) Erstellen Sie eine zweite Ginjector -Schnittstelle, beispielsweise ClientginjectOrtablet und erweitern die in (a) erstellte Ginmodule -Annotation, die auf ein unterschiedliches Modul hinweist, beispielsweise Clientmoduletablet.

- Jetzt haben Sie zwei Ginjecor-Schnittstellen eine Standardeinstellung und eine sekundäre für Tablets, die jeweils auf ein Modul mit eigenen Configure () -implementierungen zeigen.

(c) Jetzt möchten Sie Fabrik erstellen, um Ihre rechte Ginjektor -Implementierung zu erhalten. Sie können dies tun, weil der Ginjector, den Sie in (a) und (b) einen gemeinsamen Dämonitador haben, die in (a) erstellte Standardschnittstelle haben. Daher erstellen Sie eine abstrakte Facotry mit einer Methode wie folgt: öffentlicher abstrakter Kundendaten -Injektor getInjector (); Sie erstellen zwei Betonklassen der Kinder, um den Desktop/Standard -Ginjector und einen anderen zu erhalten, um den Tablet Ginjector zu erhalten.

(d) Jetzt konfigurieren Sie die GWT.XML Ihres Moduls, genau wie Google IO auf YouTube, dass Sie während der Laufzeit Ihre gewünschte Faachkristie erhalten sollten, indem Sie mit GWT -aufgeschobenen Bindungen für jedes Ihrer Ginjector -Fabrik eingesetzt werden.

(e) Auf Ihrem Einstiegspunkt ist es, dass Sie nicht einen Ginjector, sondern Ihre Fabrik für Ginjectors verwenden, indem Sie die aufgeschobene GWT -Bindung verwenden. Sie nennen die abstrakte Methode, die einen Clientginjector, Ihren Satz zurück, zurückgibt.

(f) Das epische Versagen am Ende. Mit Guice können Sie nicht zweimal so groß sind (Klasse plus Annotation), selbst wenn Sie verschiedene Injektoren verwenden (eine für Desktop und eine für Tablet). Es scheint, dass die Schlüsselbindung definitonen global sind, sobald Sie zwei Module haben, die dieselben Schlüssel neu definieren, das ist das Ende des Abenteuers.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top