2010-02-01 6 views
4

Quel est votre conseil? J'ai trouvé la solution la plus appropriée pour moi - garder les injecteurs et les modules dans les classes d'énumération. Avantages:Où conserver les injecteurs de guice?

  1. injecteurs et modules créés une fois,
  2. injecteurs peuvent être utilisés de différentes classes alors que l'application en cours d'exécution (non seulement d'amorçage),
  3. injecteurs conservés dans un endroit et peuvent être facilement trouvés.

Exemple:

import static ru.package.Modules.*; 

public enum Injectors { 

FOO_INJECTOR(BarModule.module()), 

FOO2_INJECTOR(FOO_INJECTOR.injector(), 
     Bar2Module.module(), FooModule.module()); 

private final Injector m_injector; 

Injectors (Module... modules) { 
    m_injector = Guice.createInjector(modules); 
} 

Injectors (Injector parentInjector, Module... modules) { 
    m_injector = parentInjector.createChildInjector(modules); 
} 

public Injector injector() { 
    return m_injector; 
} 
} 
+8

Ne faites pas cela. Cette stratégie a beaucoup de problèmes. Dans chaque exécution de votre programme, tous vos injecteurs seront créés, qu'ils soient nécessaires ou non. –

Répondre

5

La grande question est pourquoi?

Il ne devrait pas être nécessaire de conserver le Injector, car une fois l'injection terminée, le Injector devrait être terminé et devrait disparaître.

Cependant, si vous avez vraiment besoin Injector, vous ne pourriez pas simplement:

@Inject 
private Injector injector; 

Est-ce application web basée ou est-il autonome?

+0

Ce code est également utilisé sur le Web, mais pas seulement. A propos de l'injection de l'injecteur j'ai déjà posé une question: http://stackoverflow.com/questions/2176216/how-to-inject-injector. Le problème est que guice ne permet pas de lier ou de fournir Injector. –

+0

Je suis d'accord avec ColinD, il pourrait être utile de comprendre comment DI fonctionne. Ça va vous faire économiser beaucoup de temps et d'efforts :) – gpampara

16

Vous semblez fondamentalement comprendre mal comment fonctionne l'injection de dépendances. Si vous essayez d'utiliser une référence à Injector n'importe où dans votre code en dehors de l'endroit où vous amorcez l'application, vous n'utilisez pas l'injection de dépendance, vous l'utilisez plutôt comme un localisateur de service. Vous êtes obligé de préparer un Injector chaque fois que vous avez besoin de tester une classe et vos classes ne précisent pas dans leurs constructeurs exactement quelles sont leurs dépendances (puisque qui sait ce qu'ils vont sortir du Injector dans une méthode s'ils ont ou peut obtenir une référence à celui-ci). En fait, en utilisant enum comme vous l'avez décrit ici est encore pire que cela: vous ne pouvez pas changer du tout la configuration, même pour le test, parce que vos modules sont codés en dur dans l'énumération. Avec l'injection de dépendances, les classes déclarent uniquement leurs dépendances et autorisent le Injector à fonctionner de manière transparente (après l'appel initial pour obtenir l'objet d'application racine) afin de fournir toutes ces dépendances. Cela facilite la compréhension, le test et la modification des fonctionnalités de votre code. Quoi qu'il en soit, je suggère d'en apprendre plus sur la façon dont DI et Guice sont destinés à être utilisés ... vous ne devriez vraiment pas vouloir faire cela.

+0

Je suis nouveau à DI et Guice, donc plz être patient) 1) Il est utilisé dans l'application web, donc j'ai besoin d'allouer des objets avec tous les graphes de dépendance à l'exécution, non seulement au bootstrap. 2) Enum. Vous ne devriez pas changer de module chaque fois que vous voulez tester. Pour le test, vous pouvez configurer des modules et des injecteurs séparés (si nécessaire). 3) Et pourquoi je dois utiliser injecteur seulement pour les objets racine? Qu'en est-il, par exemple, de l'AOP? –

+0

@ColinD J'ai un besoin similaire pour l'injecteur parce que je n'ai pas seulement besoin de DI pendant la construction, mais j'aimerais aussi pouvoir accéder aux instances de Singleton pendant l'exécution (via Beanshell pour le débogage de l'exécution, etc.). En d'autres termes, j'aurais besoin d'une sorte de registre pour les singletons. Maintenant, sans DI, nous utiliserions habituellement un champ final statique pour le tenir, mais maintenant avec Guice DI, l'injecteur semble être le choix naturel pour le registre. – RAY

+0

Considérer les applications héritées dans lesquelles il peut ne pas être pratique d'appliquer immédiatement l'injection de dépendance partout dans le graphique de dépendance. Au fur et à mesure que vous essayez d'introduire l'injection de dépendance, vous finissez avec quelques utilisations de l'injecteur comme localisateur de service, stratégiquement placé. – beluchin