Dans de nombreux articles sur le Web, les termes Inversion de contrôle et Principe d'inversion de dépendance semblent être mélangés et utilisés comme synonymes (une confusion supplémentaire est renforcée par les outils appelés "DI-Containers" et "IoC-Containers"). Un article de Wikipedia fait un bon travail en essayant d'expliquer que l'IoC n'est pas la même chose que la DI:
l'inversion de contrôle (IoC) décrit une conception dans laquelle des parties personnalisées d'un programme informatique reçoivent le flux de contrôle d'une bibliothèque générique et réutilisable
Ainsi, DIP consiste à faire dépendre vos modules des abstractions plutôt que des implémentations concrètes.
Et l'IoC consiste à donner le contrôle de votre flux de programme à un module distinct. Et l'une des choses que vous pouvez faire pour ce module est de résoudre les dépendances au moment de l'exécution.
Cette différence semble juste, mais je n'ai jamais vu personne mentionner d'autres applications du principe IoC autres que la résolution des dépendances. La définition de Wikipédia est assez large, et il semble que vous pourriez faire beaucoup plus avec un module qui peut effectuer des appels dans votre code personnalisé en fonction de sa configuration et d'une logique interne.
Voici donc quelques questions que je n'arrive pas encore à comprendre:
- Quelle est la relation réelle entre l'IoC et le DIP? L'IoC sert-il toujours de moyen de mise en œuvre du DIP?
- Pourquoi les outils de résolution des dépendances sont-ils appelés conteneurs DI et IoC? Cela implique que DI et IoC sont la même chose.
Remarque : Cette question n'est pas un doublon de Quelle est la différence entre DI et IoC , car ce dernier pose des questions sur l'injection de dépendance, pas sur l'inversion de dépendance.
la source
Réponses:
Il y a un excellent article sur le site de Martin Fowler qui contient un chapitre spécifiquement sur la différence entre DIP, DI et IoC . L'essentiel de celui-ci (tel que copié à partir de ce site) est
la source
ISomeInterface object = container.Resolve<ISomeInterface>()
c'est IoC ou pas?