Comment injecter une dépendance « d'exécution » comme un utilisateur connecté qui ne sont pas disponibles au moment du démarrage de l'application?

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

Question

Je ne suis pas obtenir ceci:

J'utilise Gin dans mon application Java GWT à faire DI. L'écran de connexion est intégré dans la fenêtre d'application complète. Une fois l'utilisateur connecté Je veux injecter l'objet utilisateur dans d'autres classes comme GUI Les présentateurs que je crée, j'ai donc une sorte de dépendance d'exécution, je crois. Comment puis-je faire?

Une solution que je peux penser est STH comme:

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

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

Ainsi, lorsque l'utilisateur est connecté avec succès et j'ai l'objet i défini la propriété statique dans LoggedInUserFactory, mais cela ne fonctionnera que si le Presenter est créé après que l'utilisateur a ouvert une session qui n'est pas le cas.

Ou devrais-je utiliser un registre statique global? Je ne aime pas l'idée d'avoir des dépendances statiques dans mes classes.

Toute entrée est très apprécié.

Était-ce utile?

La solution

Au lieu de plier DI en arrière pour fournir à l'utilisateur, utilisez un EventBus pour déclencher un événement lorsque l'utilisateur se connecte à.

Si vous devez absolument utiliser DI pour cela, et les présentateurs qui exigent que l'utilisateur ne sont pas utilisé avant initialisé avec un utilisateur non nul vous pouvez reporter votre appel à GWT.create(MyGinjector.class) jusqu'à ce que l'utilisateur est connecté. Vous auriez alors deux de ces appels dans votre application: un pour le chemin de code de connexion et un second pour le reste de l'application

.

Autres conseils

Vous pouvez utiliser le Fournisseur interface.

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

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

Ensuite, votre module aurait un fournisseur comme ceci:

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

EDIT: Pour définir la variable d'utilisateur, le code client pourrait obtenir l'instance de la classe UserProvider via une liaison de la manière suivante:

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

... ce qui permettrait au code client de faire ceci:

injector.getInstance(UserProvider.class).user = new User(...)
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top