Question

J'ai des problèmes de dépendance circulale dans un ensemble de projets GWT ("Projet principal", "Widgets Project", "Service Adapter Project"). Références principales widgets et adaptateurs de service. Adaptateurs de service de référence des widgets. Et voici le problème. Je voudrais utiliser un EventBus pratiquement partout, injecté. Où dois-je mettre mon interface de ginjector?

Il doit être utilisable de chaque projet et doit également faire référence à des classes de chaque projet, pour pouvoir injecter des classes de différents projets. C'est évidemment incompilable.

J'ai pensé à utiliser un ginjecteur séparé pour les widgets et un pour seulement le EventBus. Si deux ginjecteurs séparés utilisent deux distincts GinModules les deux contenant @Singleton EventBus reliures, les deux getters renverront la même EventBus instances ou pas?

Remarque: c'est un gin, pas une question de Guice.

Était-ce utile?

La solution

La façon la plus simple à laquelle je peux penser est de créer EventBus En tant que singleton dans un injecteur séparé (ou le faire un champ final statique dans une classe), utilisez alors @Provides dans d'autres injecteurs pour accéder à ce spécifique EventBus exemple.

Autres conseils

Je fais un module pour chaque section logique (un ou plusieurs par projet souvent), puis un seul ginjecteur, mis à disposition du point d'entrée, faisant référence à tous les modules dont il a besoin. Tout (presque) après le point d'entrée est ensuite créé par le gin, il pourra donc injecter des champs.

Chaque nouveau ginjecteur qui est GWT.create'D aura son propre ensemble de singletons, il est donc important de ne créer qu'un seul ginjector racine. Il est possible d'injecter cet injecteur à d'autres parties de la base de code, mais rend généralement un code plus lisible si vous ne le faites pas.

Si vous avez besoin de passer des instances de EventBus Ou toute autre chose aux objets non créés par le gin, il existe quelques options. La première consiste à créer votre propre instance de fournisseur et à lier que dans le module (ou créer des méthodes dans le module annoté avec @Provides). La seconde consiste à créer des méthodes dans le ginjector qui prennent un seul paramètre et RETOUR VOID - Gin pourra injecter tous les champs et setters pour ce type déclaré. Dans l'exemple ci-dessous, seuls les champs et les setters annotent avec @Inject dans MyWidget Et ses superclasses seront injectées - il ne saura pas également chercher des sous-classes.

void injectMyWidget(MyWidget widget);
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top