Utilisation de @Singleton dans deux instances de ginjector
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.
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);