2010-03-29 3 views
6

(Cette question ne repose pas sur un cadre IoC spécifique, de sorte que les interfaces et types dans mes échantillons sont méta-types. Il suffit de les remplacer par les types appropriés pour votre cadre IoC préféré dans votre tête.)Injection de dépendances: Comment faire passer le conteneur d'injection?

Dans mon principales méthodes, je généralement mis en place mon conteneur faire quelque chose comme ceci:

static void Main() 
{ 
    IInjector in = new Injector(); 
    in.Register<ISomeType>().For<SomeType>(); 
    in.Register<IOtherType().For<OtherType>(); 
    ... 

    // Run actual application 
    App app = in.Resolve<App>(); 
    app.Run(); 
} 

ma question est, comment obtenez-vous Injector envoyé autour? Normalement, j'ai simplement enregistré l'injecteur avec lui-même et l'ai fait injecter dans des types qui vont eux-mêmes faire l'injection, mais je ne suis pas sûr que ce soit le «modèle» approprié.

Répondre

14

Vous ne devez pas faire circuler le conteneur. Au lieu de cela, votre méthode point d'entrée/méthode principale demande au conteneur les objets dont il a besoin pour démarrer, tels que votre objet App/bean. Le conteneur renvoie ensuite le graphique de l'objet complet connecté à App, ce qui vous permet d'exécuter app.Run(), avec toutes les dépendances satisfaites.

Il est un peu un anti-modèle pour les objets à être au courant du conteneur, ou pour chaque objet à demander le conteneur pour ce qui est des dépendances - si vous faites cela, alors vous avez pas contrôle inversée et ce que vous ce n'est pas l'injection de dépendance - vous avez toujours des objets qui demandent ce dont ils ont besoin, plutôt que de recevoir ce dont ils ont besoin.

+1

Ok, que diriez-vous de ceci. L'App est un WinForm et a un bouton qui crée et montre un formulaire. Chaque fois que ce bouton est poussé, une nouvelle instance de ce formulaire doit être créée et affichée. Ce formulaire a des dépendances, il doit donc être résolu par le formulaire d'application pour chaque instanciation. Maintenant quoi? – Alex

+2

@Alex: Dans ce cas, vous pouvez utiliser "Providers" (Factories spécialisées) que j'ai mentionné dans mon autre post. La différence entre l'injection d'un fournisseur et l'injection de tout l'injecteur est que cela limite fortement les dépendances indirectes «secrètes». IOW, il ne dégrade pas l'injecteur à un localisateur de service. –

+0

@chris_l: Alors les "Providers" peuvent garder l'Injector, non? Sinon, nous avons simplement déplacé le problème ailleurs. – Alex

2

Il est préférable d'éviter d'injecter l'injecteur. Créez simplement les types dont vous avez besoin, puis commencez l'exécution. J'ai écrit un article un peu plus long sur ce sujet: Accessing the DI container

Questions connexes