Come iniettare una dipendenza “runtime” come un utente collegato che non è disponibile al momento dell'avvio dell'applicazione?

StackOverflow https://stackoverflow.com/questions/4629777

Domanda

Non sto ricevendo in questo modo:

Io uso Gin nel mio Java GWT app per fare DI. La schermata di login è integrato nella finestra dell'applicazione completa. Dopo che l'utente ha effettuato l'accesso voglio iniettare l'oggetto utente in altre classi come GUI presentatori che creo, quindi ho una sorta di dipendenza runtime credo. Come faccio a farlo?

Una soluzione che posso pensare è sth come:

class Presenter {
  @Inject
  Presenter(LoggedInUserFactory userFactory) {
     User user = userFactory.getLoggedInUser();
  }
}

class LoggedInUserFactoryImpl {
  public static User user;
  User getLoggedInUser() {
    return user;
  }
}

Così, quando l'utente è connesso con successo e non ho l'oggetto ho impostato la proprietà statica in LoggedInUserFactory, ma questo sarà solo lavoro se il Presenter è creato dopo che l'utente ha effettuato l'accesso, che non è il caso.

O devo usare un registro statico globale? Io proprio non mi piace l'idea di avere dipendenze statiche nelle mie classi.

Ogni ingresso è molto apprezzato.

È stato utile?

Soluzione

Invece di piegatura DI in quattro per fornire all'utente, utilizzare un EventBus per generare un evento quando l'utente accede a.

Se è assolutamente necessario utilizzare DI per questo e presentatori che richiedono l'utente non vengono utilizzati fino a quando correttamente inizializzata con un utente non nullo si può rinviare la chiamata a GWT.create(MyGinjector.class) fino a dopo l'utente è connesso. Si dovrebbe quindi due tali chiamate nella vostra applicazione: uno per il percorso del codice di login e un secondo per il resto dell'applicazione

.

Altri suggerimenti

Si potrebbe utilizzare il Provider interfaccia.

class Presenter {
  @Inject
  Presenter(Provider<User> userProvider) {
     User user = userProvider.get();
  }
}

class UserProvider implements Provider<User> {
  public User user;
  User get() {
    return user;
  }
}

Poi il modulo avrebbe un href="http://code.google.com/docreader/#p=google-guice&s=google-guice&t=ProviderBindings" rel="nofollow"> fornitore in questo modo:

bind(User.class).toProvider(UserProvider.class);

Modifica Per impostare la variabile utente, codice cliente potrebbe ottenere l'istanza della classe UserProvider tramite un legame simile a questo:

bind(UserProvider.class).in(Singleton.class);

... che permetterebbe il codice del client per fare questo:

injector.getInstance(UserProvider.class).user = new User(...)
scroll top