Selon l' article écrit par Martin Fowler , l'inversion de contrôle est le principe où le flux de contrôle d'un programme est inversé: au lieu du programmeur contrôlant le flux d'un programme, les sources externes (framework, services, autres composants) prennent le contrôle de il. C'est comme si nous branchions quelque chose à autre chose. Il a cité un exemple concernant EJB 2.0:
Par exemple, l'interface Session Bean définit ejbRemove, ejbPassivate (stocké sur le stockage secondaire) et ejbActivate (restauré à partir de l'état passif). Vous ne pouvez pas contrôler le moment où ces méthodes sont appelées, juste ce qu'elles font. Le conteneur nous appelle, nous ne l'appelons pas.
Cela conduit à la différence entre le framework et la bibliothèque:
L'inversion de contrôle est un élément clé de ce qui rend un framework différent d'une bibliothèque. Une bibliothèque est essentiellement un ensemble de fonctions que vous pouvez appeler, ces jours-ci généralement organisés en classes. Chaque appel effectue un certain travail et renvoie le contrôle au client.
Je pense que le point de vue selon lequel DI est IOC signifie que la dépendance d'un objet est inversée: au lieu de contrôler ses propres dépendances, son cycle de vie ... quelque chose d'autre le fait pour vous. Mais, comme vous me l'avez dit à la main, DI n'est pas nécessairement IOC. Nous pouvons toujours avoir DI et pas de CIO.
Cependant, dans cet article (de la pococapsule, un autre cadre IOC pour C / C ++), il suggère qu'en raison de l'IOC et de DI, les conteneurs IOC et les cadres DI sont beaucoup plus supérieurs à J2EE, car J2EE mélange le code de cadre dans les composants , ce qui ne fait donc pas de lui un simple objet Java / C ++ (POJO / POCO).
Inversion des conteneurs de contrôle autres que le modèle d'injection de dépendance (lien d'archive)
Lecture supplémentaire pour comprendre quel est le problème avec l'ancien Framework de développement basé sur les composants, ce qui conduit au deuxième article ci-dessus: Pourquoi et quoi d'inversion de contrôle (lien d'archive)
Ma question : qu'est-ce que le CIO et DI exactement? Je suis confus. Basé sur pococapsule, IOC est quelque chose de plus significatif que la simple inversion du contrôle entre les objets ou les programmeurs et les frameworks.
Réponses:
IoC est un terme générique qui signifie plutôt que l'application appelle les méthodes dans un cadre, le cadre appelle les implémentations fournies par l'application.
DI est une forme d'IoC, où les implémentations sont passées dans un objet via des constructeurs / setters / services lookups, dont l'objet dépendra afin de se comporter correctement.
L'IoC sans utiliser DI , par exemple, serait le modèle de modèle car l'implémentation ne peut être modifiée que par sous-classification.
Les cadres DI sont conçus pour utiliser DI et peuvent définir des interfaces (ou annotations en Java) pour faciliter le passage dans les implémentations.
Les conteneurs IoC sont des infrastructures DI qui peuvent fonctionner en dehors du langage de programmation. Dans certains, vous pouvez configurer les implémentations à utiliser dans les fichiers de métadonnées (par exemple XML) qui sont moins invasives. Avec certains, vous pouvez faire de l'IoC qui serait normalement impossible, comme injecter une implémentation aux coupes ponctuelles .
Voir aussi cet article de Martin Fowler .
la source
En bref, l'IoC est un terme beaucoup plus large qui inclut, mais sans s'y limiter, DI
Le terme Inversion of Control (IoC) signifiait à l'origine toute sorte de style de programmation où un cadre global ou l'exécution contrôlait le flux du programme
Avant que DI ait un nom, les gens ont commencé à se référer aux cadres qui gèrent les dépendances comme inversion des conteneurs de contrôle, et bientôt, la signification de l'IoC a progressivement dérivé vers cette signification particulière: inversion du contrôle des dépendances.
L'inversion de contrôle (IoC) signifie que les objets ne créent pas d'autres objets sur lesquels ils s'appuient pour faire leur travail. Au lieu de cela, ils obtiennent les objets dont ils ont besoin d'une source externe (par exemple, un fichier de configuration xml).
L'injection de dépendance (DI) signifie que cela se fait sans l'intervention de l'objet, généralement par un composant de structure qui transmet les paramètres du constructeur et définit les propriétés.
la source
la source
IoC ( I nVersion o f C ontrôle): - Il est un terme générique et mis en œuvre de plusieurs façons (événements, délégués , etc.).
DI ( D ependency I njection): - DI est un sous-type d'IoC et est implémenté par injection constructeur, injection setter ou injection interface .
Mais, Spring ne prend en charge que les deux types suivants:
NullPointerException: bean does not exist
. L'injection de constructeur est la meilleure pratique pour injecter des dépendances.la source
DI est un sous-ensemble d'IoC
Voici quelques autres techniques pour atteindre l'IoC .
la source
IOC (Inversion Of Control) : Donner le contrôle au conteneur pour obtenir une instance de l'objet s'appelle Inversion of Control, signifie qu'au lieu de créer un objet à l'aide du nouvel opérateur, laissez le conteneur faire cela pour vous.
DI (Dependency Injection) : La manière d'injecter des propriétés à un objet s'appelle Dependency Injection .
Nous avons trois types d' injection de dépendance :
Spring prend uniquement en charge l' injection constructeur et l' injection Setter / Getter .
la source
Puisque toutes les réponses mettent l'accent sur la théorie, je voudrais démontrer avec un exemple de première approche:
Supposons que nous construisons une application qui contient une fonctionnalité pour envoyer des messages de confirmation SMS une fois la commande expédiée. Nous aurons deux classes, l'une est responsable de l'envoi du SMS (SMSService), et l'autre responsable de la capture des entrées utilisateur (UIHandler), notre code ressemblera à ci-dessous:
L'implémentation ci-dessus n'est pas fausse, mais il y a quelques problèmes:
-) Supposons que dans l'environnement de développement, vous souhaitiez enregistrer les SMS envoyés dans un fichier texte au lieu d'utiliser la passerelle SMS, pour y parvenir; nous finirons par changer l'implémentation concrète de (SMSService) par une autre implémentation, nous perdons de la flexibilité et nous sommes obligés de réécrire le code dans ce cas.
-) Nous finirons par mélanger les responsabilités des classes, notre (UIHandler) ne devrait jamais connaître l'implémentation concrète de (SMSService), cela devrait être fait en dehors des classes en utilisant "Interfaces". Lorsque cela est implémenté, il nous donnera la possibilité de changer le comportement du système en échangeant le (SMSService) utilisé avec un autre service fictif qui implémente la même interface, ce service enregistrera les SMS dans un fichier texte au lieu de les envoyer à mobileNumber.
Pour résoudre les problèmes ci-dessus, nous utilisons des interfaces qui seront mises en œuvre par notre (SMSService) et le nouveau (MockSMSService), fondamentalement la nouvelle interface (ISMSService) exposera les mêmes comportements des deux services que le code ci-dessous:
Ensuite, nous allons changer notre implémentation (SMSService) pour implémenter l'interface (ISMSService):
Nous allons maintenant pouvoir créer un nouveau service de maquette (MockSMSService) avec une implémentation totalement différente en utilisant la même interface:
À ce stade, nous pouvons changer le code dans (UIHandler) pour utiliser l'implémentation concrète du service (MockSMSService) facilement comme ci-dessous:
Nous avons obtenu beaucoup de flexibilité et mis en œuvre la séparation des problèmes dans notre code, mais nous devons toujours modifier la base de code pour basculer entre les deux services SMS. Nous devons donc implémenter l' injection de dépendance .
Pour y parvenir, nous devons implémenter une modification de notre constructeur de classe (UIHandler) pour passer la dépendance à travers elle, ce faisant, le code qui utilise le (UIHandler) peut déterminer quelle implémentation concrète de (ISMSService) utiliser:
Maintenant, le formulaire d'interface utilisateur qui parlera avec la classe (UIHandler) est responsable de passer quelle implémentation de l'interface (ISMSService) utiliser. Cela signifie que nous avons inversé le contrôle, le (UIHandler) n'est plus responsable de décider quelle implémentation utiliser, le code appelant le fait. Nous avons mis en œuvre le principe d' inversion de contrôle dont DI est un type.
Le code du formulaire d'interface utilisateur sera le suivant:
la source
Mais la documentation du printemps indique qu'ils sont identiques.
http://docs.spring.io/spring/docs/current/spring-framework-reference/htmlsingle/#beans-introduction
Dans la première ligne, " IoC est également connu sous le nom d'injection de dépendance (DI) ".
la source
IoC - Inversion de contrôle est un terme générique, indépendant du langage, il ne s'agit en fait pas de créer les objets mais de décrire dans quel objet de mode est créé.
DI - L'injection de dépendances est un terme concret, dans lequel nous fournissons des dépendances de l'objet au moment de l'exécution en utilisant différentes techniques d'injection, à savoir. Setter Injection, Constructor Injection ou par Interface Injection.
la source
L'inversion du contrôle est un paradigme de conception dans le but de donner plus de contrôle aux composants ciblés de votre application, ceux qui font le travail.
L'injection de dépendances est un modèle utilisé pour créer des instances d'objets sur lesquels d'autres objets s'appuient sans savoir au moment de la compilation quelle classe sera utilisée pour fournir cette fonctionnalité.
Il existe plusieurs techniques de base pour implémenter l'inversion de contrôle. Ceux-ci sont:
1). Une injection constructeur
2). Une injection de setter
3). Une injection d'interface
la source
DI et IOC sont deux modèles de conception qui se concentrent principalement sur la fourniture d' un couplage lâche entre les composants , ou simplement sur la façon dont nous découplons les relations de dépendance conventionnelles entre les objets afin que les objets ne soient pas serrés les uns par rapport aux autres.
Avec les exemples suivants, j'essaie d'expliquer ces deux concepts.
Auparavant, nous écrivons du code comme celui-ci
Avec l'injection de dépendance, l'injecteur de dépendance se charge de l'instanciation des objets
Le processus ci-dessus consistant à donner le contrôle à un autre (par exemple le conteneur) pour l'instanciation et l'injection peut être appelé inversion de contrôle et le processus dans lequel le conteneur IOC injecte la dépendance pour nous peut être appelé injection de dépendance.
IOC est le principe où le flux de contrôle d'un programme est inversé: au lieu que le programmeur contrôle le flux d'un programme , le programme contrôle le flux en réduisant les frais généraux du programmeur et le processus utilisé par le programme pour injecter la dépendance est appelé DI
Les deux concepts fonctionnent ensemble, ce qui nous permet d'écrire du code beaucoup plus flexible, réutilisable et encapsulé, ce qui en fait des concepts importants dans la conception de solutions orientées objet.
Recommande également de lire.
Qu'est-ce que l'injection de dépendance?
Vous pouvez également consulter une de mes réponses similaires ici
Différence entre l'inversion du contrôle et l'injection de dépendance
la source
Inversion of Control est un principe de conception générique de l'architecture logicielle qui aide à créer des cadres logiciels modulaires réutilisables et faciles à entretenir.
Il s'agit d'un principe de conception dans lequel le flux de contrôle est «reçu» de la bibliothèque générique écrite ou du code réutilisable.
Pour mieux le comprendre, voyons comment nous codions dans nos premiers jours de codage. Dans les langages procéduraux / traditionnels, la logique métier contrôle généralement le flux de l'application et "appelle" le code / les fonctions génériques ou réutilisables. Par exemple, dans une application console simple, mon flux de contrôle est contrôlé par les instructions de mon programme, qui peuvent inclure les appels à certaines fonctions générales réutilisables.
En revanche, avec l'IoC, les Frameworks sont le code réutilisable qui "appelle" la logique métier.
Par exemple, dans un système basé sur Windows, un cadre sera déjà disponible pour créer des éléments d'interface utilisateur comme des boutons, des menus, des fenêtres et des boîtes de dialogue. Lorsque j'écris la logique métier de mon application, ce sont les événements du framework qui appellent mon code logique métier (lorsqu'un événement est déclenché) et NON l'inverse.
Bien que le code du framework ne connaisse pas ma logique métier, il saura toujours comment appeler mon code. Ceci est réalisé en utilisant des événements / délégués, des rappels, etc. Ici, le contrôle du flux est "inversé".
Ainsi, au lieu de dépendre du flux de contrôle sur des objets liés statiquement, le flux dépend du graphique d'objet global et des relations entre les différents objets.
L'injection de dépendance est un modèle de conception qui met en œuvre le principe IoC pour résoudre les dépendances des objets.
En termes plus simples, lorsque vous essayez d'écrire du code, vous créerez et utiliserez différentes classes. Une classe (classe A) peut utiliser d'autres classes (classe B et / ou D). Ainsi, les classes B et D sont des dépendances de la classe A.
Une analogie simple sera une voiture de classe. Une voiture peut dépendre d'autres classes comme le moteur, les pneus et plus encore.
L'injection de dépendance suggère qu'au lieu que les classes dépendantes (Class Car ici) créent ses dépendances (moteur de classe et classe Tire), la classe devrait être injectée avec l'instance concrète de la dépendance.
Permet de comprendre avec un exemple plus pratique. Considérez que vous écrivez votre propre TextEditor. Entre autres choses, vous pouvez avoir un correcteur orthographique qui fournit à l'utilisateur la possibilité de vérifier les fautes de frappe dans son texte. Une implémentation simple d'un tel code peut être:
À première vue, tout semble rose. L'utilisateur écrira du texte. Le développeur capturera le texte et appellera la fonction CheckSpellings et trouvera une liste de fautes de frappe qu'il montrera à l'utilisateur.
Tout semble bien fonctionner jusqu'à un beau jour où un utilisateur commence à écrire le français dans l'éditeur.
Pour prendre en charge plus de langues, nous devons avoir plus de vérificateurs orthographiques. Probablement français, allemand, espagnol, etc.
Ici, nous avons créé un code étroitement couplé avec SpellChecker "anglais" étant étroitement couplé à notre classe TextEditor, ce qui signifie que notre classe TextEditor dépend de EnglishSpellChecker ou en d'autres termes, EnglishSpellCheker est la dépendance de TextEditor. Nous devons supprimer cette dépendance. De plus, notre éditeur de texte a besoin d'un moyen de conserver la référence concrète de tout correcteur orthographique en fonction de la discrétion du développeur au moment de l'exécution.
Ainsi, comme nous l'avons vu dans l'introduction de DI, cela suggère que la classe devrait être injectée avec ses dépendances. Ainsi, il devrait être de la responsabilité du code appelant d'injecter toutes les dépendances dans la classe / le code appelé. Nous pouvons donc restructurer notre code comme
Dans notre exemple, la classe TextEditor doit recevoir l'instance concrète de type ISpellChecker.
Maintenant, la dépendance peut être injectée dans le constructeur, une propriété publique ou une méthode.
Essayons de changer notre classe en utilisant le constructeur DI. La classe TextEditor modifiée ressemblera à quelque chose comme:
Pour que le code appelant, lors de la création de l'éditeur de texte, puisse injecter le type SpellChecker approprié à l'instance de TextEditor.
Vous pouvez lire l'article complet ici
la source
IOC (Inversion Of Control): Donner le contrôle au conteneur pour obtenir l'instance de l'objet s'appelle Inversion of Control. Cela signifie qu'au lieu de créer un objet à l'aide d'un nouvel opérateur , laissez le conteneur faire cela pour vous.
DI (Dependency Injection): Le passage des paramètres (propriétés) requis de XML à un objet (dans POJO CLASS) est appelé injection de dépendance.
la source
IOC indique qu'une classe externe gère les classes d'une application et que les classes externes signifient qu'un conteneur gère la dépendance entre les classes d'application. Le concept de base d' IOC est que le programmeur n'a pas besoin de créer vos objets mais décrit comment ils doivent être créés.
Les tâches principales effectuées par le conteneur IoC sont les suivantes: instancier la classe d'application. pour configurer l'objet. pour assembler les dépendances entre les objets.
DI est le processus de fourniture des dépendances d'un objet au moment de l'exécution en utilisant l'injection de setter ou l'injection de constructeur.
la source
IOC (Inversion of Control) est essentiellement un concept de modèle de conception consistant à supprimer les dépendances et à les découpler pour rendre le flux non linéaire et à laisser le conteneur / ou une autre entité gérer l'approvisionnement des dépendances. Il suit en fait le directeur d'Hollywood «Ne nous appelez pas, nous vous appellerons» Donc, résumant les différences.
Inversion de contrôle: - C'est un terme générique pour découpler les dépendances et déléguer leur provisioning, et cela peut être implémenté de plusieurs manières (événements, délégués, etc.).
Injection de dépendance: - DI est un sous-type d'IOC et est implémenté par injection constructeur, injection setter ou injection méthode.
L'article suivant décrit cela très bien.
https://www.codeproject.com/Articles/592372/Dependency-Injection-DI-vs-Inversion-of-Control-IO
la source
Je pense que l'idée peut être clairement démontrée sans entrer dans les mauvaises herbes orientées objet, qui semblent brouiller l'idée.
Si vous inclinez la tête et plissez les yeux, vous verrez que DI est une implémentation particulière de l'IoC avec des préoccupations spécifiques. Au lieu d'injecter des modèles et des comportements dans un cadre d'application ou une opération d'ordre supérieur, vous injectez des variables dans une fonction ou un objet.
la source
Commençons par D de SOLID et regardons DI et IoC du livre de Scott Millett "Professional ASP.NET Design Patterns":
Millett, C (2010). Modèles de conception ASP.NET professionnels. Éditions Wiley. 7-8.
la source
// ICO, DI, 10 ans en arrière, c'était comme ça:
Maintenant, avec le printemps 3,4 ou le dernier son similaire ci-dessous
Globalement, le contrôle est inversé de l'ancien concept de code couplé aux cadres comme Spring qui rend l'objet disponible. C'est donc l'IOC pour autant que je sache et l'injection de dépendances comme vous le savez lorsque nous injectons l'objet dépendant dans un autre objet à l'aide du constructeur ou des setters. Injecter signifie essentiellement le passer comme argument. Au printemps, nous avons une configuration basée sur XML et annotation où nous définissons l'objet bean et passons l'objet dépendant avec le style d'injection Constructeur ou setter.
la source
J'ai trouvé le meilleur exemple sur Dzone.com qui est vraiment utile pour comprendre la vraie différence entre IOC et DI
Lire l'article complet sur le CIO et lire l'article complet DI
la source
1) DI est Child-> obj dépend de parent-obj. Le verbe dépend est important. 2) IOC est Child-> obj effectuer sous une plate-forme. où la plate-forme pourrait être l'école, le collège, la classe de danse. Ici, effectuer est une activité avec des implications différentes sous n'importe quel fournisseur de plate-forme.
exemple pratique: `
"
-UN B
la source
Quant à cette question, je dirais que le wiki a déjà fourni des explications détaillées et faciles à comprendre. Je ne citerai ici que les plus importants.
Implémentation d'IoC
Quant à l' injection de dépendance
la source
Le concept IoC a été initialement entendu pendant l'ère de la programmation procédurale. Par conséquent, dans un contexte historique, l'IoC a parlé d'inversion de la propriété du contrôle- flux c'est-à-dire à qui appartient la responsabilité d'invoquer les fonctions dans l'ordre souhaité - que ce soit les fonctions elles-mêmes ou devez-vous les inverser vers une entité externe.
Cependant, une fois que la POO a émergé, les gens ont commencé à parler de l'IoC dans le contexte de POO où les applications sont également concernées par la création d'objets et leurs relations, en dehors du flux de contrôle. De telles applications voulaient inverser la propriété de la création d'objets (plutôt que du flux de contrôle) et nécessitaient un conteneur responsable de la création d'objets, du cycle de vie des objets et de l'injection des dépendances des objets d'application, éliminant ainsi les objets d'application de la création d'autres objets concrets.
En ce sens, DI n'est pas la même chose que Io C , car il ne s'agit pas de contrôle-flux, mais c'est une sorte d'Io * , c'est-à-dire d'inversion de propriété de la création d'objet.
Qu'est-ce qui ne va pas dans ma façon d'expliquer DI et IoC?
la source
IoC aka Inversion of Control se réfère au contrôle de création d'instances effectué par le conteneur Spring. Le contrôle de création et de construction d'objets est pris en charge par le conteneur. Le conteneur crée les objets et les injecte dans notre application.
la source