Injection de dépendance: comment faire passer le récipient d’injection?

(Cette question ne repose pas sur un framework IoC spécifique, les interfaces et les types de mes exemples sont donc des méta-types. Il vous suffit de les remplacer par les types appropriés pour votre framework IoC préféré.)

Dans mes méthodes principales, je configure généralement mon conteneur en procédant de la manière suivante:

static void Main() { IInjector in = new Injector(); in.Register().For(); in.Register<IOtherType().For(); ... // Run actual application App app = in.Resolve(); app.Run(); } 

Ma question est, comment obtenez-vous l’injecteur envoyé autour? Je viens normalement d’enregistrer l’injecteur avec lui-même et je l’ai fait injecter à des types qui vont eux-mêmes faire l’injection, mais je ne suis pas sûr que ce soit le “motif” approprié.

Vous ne devriez pas faire passer le conteneur.

Au lieu de cela, votre méthode entry-point / main demande au conteneur les objects dont il a besoin pour commencer, tels que votre object / bean App. Le conteneur renvoie ensuite le graphe d’object complet connecté à App , ce qui vous permet d’exécuter app.Run() avec toutes les dépendances remplies.

C’est un peu un anti-motif pour les objects de connaître le conteneur, ou pour chaque object de demander au conteneur ses dépendances – si vous faites cela, vous n’avez pas le contrôle inversé et ce que vous avez n’est pas une dependency injection – vous avez encore des objects demandant ce dont ils ont besoin, plutôt que de recevoir ce dont ils ont besoin.

Il est préférable d’éviter d’injecter l’injecteur. Créez simplement les types dont vous avez besoin, puis lancez l’exécution. J’ai écrit un article un peu plus long sur ce sujet: Accès au conteneur d’ID