Domanda

Ho un WebApp che utilizza Gin per iniettare dipendenze nel punto di ingresso.

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

Ho bisogno di una versione mobile che utilizzi un'implementazione di rootview diversa. Le dipendenze sono descritte nel seguente modulo

public class RootViewMobileInject extends AbstractGinModule {

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

La domanda è come scegliere la dipendenza necessaria condizionatamente sia che abbiamo bisogno di una versione mobile o predefinita. ho visto Implementazioni multiple GWT-Gin, ma non ho capito quella soluzione perché il provider rompe la catena delle dipendenze e il modello di fabbrica rompe la testabilità. Nel video "Big Modular Java with Guice" Qui (12 minuti) L'iniettore di Guice con moduli è stato presentato come sostituto delle fabbriche. Quindi la mia domanda è che dovrei creare diversi giniettori per versioni mobili e predefinite (come MobileFactory e DefaultFactory) della mia app o sarebbe una cattiva pratica e dovrei configurare un'istanza di ginjector con tutte le versioni necessarie. Ad esempio con i legami di annotazione come questo.

public class RootViewMobileInject extends AbstractGinModule {

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

e usa i binding annotati @Mobile al punto di ingresso GWT

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

In un esempio così semplificato come sopra potrebbe essere possibile. Ma se un'applicazione ha più dipendenze che necessitano di versioni mobili e predefinite. Sembra di nuovo a "brutte" non stimiabili (come si diceva alla presentazione di Guice). Mi scusi per il mio inglese. Qualsiasi aiuto è apprezzato.

È stato utile?

Soluzione

Credo che vorrai utilizzare l'associazione differita GWT, usando la sostituzione della classe per associare una versione diversa del tuo servizio di iniettori a seconda dell'agente utente. Ciò assicurerà che la versione mobile abbia solo le implementazioni mobili compilate (e scaricate)

Quindi avresti iniettoriServeceSktop, iniettorivicemobile, che si estendono entrambi da inierservice, quindi gwt.create (inierservice.class), e lascia che il legame differito decida quale implementazione dovrebbe utilizzare.

http://code.google.com/webtoolkit/doc/latest/devguidecodingbasicsdeferred.html#replacement

Un'istanza di ginjector con tutte le versioni sembra male in quanto significa che tutto il codice per entrambe le versioni è sempre scaricato (e certamente non vuoi scaricare tutte le viste desktop nella tua app mobile)

EDIT: come sottolinea Thomas nei commenti, poiché gli iniettori sono generati classi, dovrai mettere ciascun iniettoreServicexxx all'interno di una semplice classe di supporto che GWT.Create () è l'iniezioneServicexxx e utilizzare la sostituzione per passare da un portafoglio tra i supporti.

Altri suggerimenti

Fare quello che vuoi è in realtà piuttosto complicato perché l'interfaccia comune dell'iniettore, che è annotata con il tuo modulo Gin, non può essere puntato a un modulo Gin astratto. Il modulo Gin indicato dall'interfaccia ginjector deve essere concreto. Un modulo concreto non può soddisfare più configurazioni contemporaneamente.

Quindi quello che fai è: (a) Crea l'interfaccia Ginjector, diciamo il cliente e il modulo, clientModule, per un'applicazione desktop.

(b) Creare una seconda interfaccia ginjector, ad esempio clientGinjectablet, che estende quella che hai creato in (a) ma con un'annotazione ginmodule che punta a un modulo diverso, diciamo clientmoduletablet.

- Ora hai due interfacce Ginjecor una e una secondaria predefinita per i tablet, ognuno che indica un modulo con le proprie implementazioni di configurazione ().

(c) Ora vuoi creare fabbrica per ottenere l'implementazione del tuo ginjector giusto. Puoi farlo perché il ginjector che hai caricato in (a) e (b) ha un demonitador comune che è l'interfaccia predefinita creata in (a). Quindi crei un facce astratto con un metodo come questo: cliente astratto pubblico getInciettore (); Crei due classi di calcestruzzo per bambini uno per ottenere il ginjettore desktop/predefinito e un altro per ottenere il ginjettore del tablet.

(d) Ora configura gwt.xml del tuo modulo proprio come Google Io su YouTube spiega che dovresti ottenere il facetry desiderato durante il runtime, utilizzando attacchi differiti GWT per ciascuna delle tue fabbriche di giniettori.

(e) Sul tuo punto di ingresso la cosa del crista che non è quella di ottenere un ginjettore ma la tua fabbrica per i ginjettori usando il legame differito GWT. Chiami il metodo astratto che restituisce un clienteginiettore, il tuo set.

(f) L'epica fallisce alla fine. Guice non ti permetterà di vincolare due volte la stessa chiave (classe più annotazione), anche se si utilizzano iniettori diversi (uno per il desktop e uno per il tablet). Sembra che i definiti di legame chiave siano globali, non appena hai due moduli che ridefiniscono le stesse chiavi, questa è la fine dell'avventura.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top