Wie eine „Laufzeit“ Abhängigkeit injizieren wie ein angemeldeter Benutzer, die bei Anwendung des Bootens nicht verfügbar ist?

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

Frage

Ich bin nur nicht diese bekommen:

Ich benutze Gin in meinem Java-GWT app DI zu tun. Der Anmeldebildschirm wird in das Vollanwendungsfenster integriert. Nachdem der Benutzer angemeldet hat in ich das Benutzerobjekt in andere Klassen wie GUI Präsentatoren injizieren wollen, die ich schaffen, so dass ich eine Art von Laufzeitabhängigkeit haben, glaube ich. Wie kann ich das tun?

Eine Lösung, die ich denken kann, ist etw wie:

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

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

Also, wenn der Benutzer erfolgreich angemeldet und ich habe das Objekt i die statische Eigenschaft in LoggedInUserFactory gesetzt, aber dies funktioniert nur, wenn der Presenter erstellt wird, nachdem der Benutzer in der angemeldet hat, ist nicht der Fall.

Oder soll ich eine globale statische Registrierung verwenden? Ich einfach nicht wie die Idee des mit statischen Abhängigkeiten in meinen Klassen.

Jede Eingabe wird sehr geschätzt.

War es hilfreich?

Lösung

Statt DI über rückwärts von Biegen der Benutzer zu liefern, verwenden Sie ein EventBus ein Ereignis ausgelöst, wenn sich der Benutzer anmeldet.

Wenn Sie unbedingt DI dafür verwenden müssen, und die Moderatoren, die die Benutzer benötigen, werden verwendet, erst richtig mit einem Nicht-Null-Benutzer initialisiert Sie Ihren Anruf GWT.create(MyGinjector.class), bis der Benutzer angemeldet ist aufschieben können. Sie würden dann haben zwei solche Anrufe in Ihrer Anwendung: ein für den Login-Code-Pfad und ein zweite für den Rest der Anwendung

.

Andere Tipps

könnten Sie verwenden den Provider Schnittstelle.

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

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

Dann wäre Ihr Modul einen Anbieter verbindlich wie folgt aus:

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

EDIT: , um die Benutzervariablen zu setzen, Client-Code die Instanz der Klasse UserProvider über eine Bindung wie diese erhalten könnte:

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

..., das der Client-Code erlauben würde, dies zu tun:

injector.getInstance(UserProvider.class).user = new User(...)
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top