Je conçois un nouveau système et je veux savoir ce qu'est l'inversion de contrôle (IOC) et, plus important encore, quand l'utiliser.
Doit-il être implémenté avec des interfaces ou peut-il être fait avec des classes?
design
design-patterns
inversion-of-control
Maître Jedi Spooky
la source
la source
Réponses:
IoC (voir Inversion du contrôle sur Wikipedia) est applicable dans le cas où un composant ne peut pas exécuter une tâche entièrement parce qu'il ne dispose pas des informations ou fonctionnalités nécessaires.
L'exemple le plus simple d'un modèle IoC serait les fonctions de rappel en C. Par exemple, vous pouvez déclarer la fonction:
Ce qui itère sur l'
list
application de laf
fonction à chacun de ses éléments. LaIterator
fonction ne sait pas comment chaque élément sera traité, vous fournissez simplement une fonction en tant qu'argument et elle les traite.Comme le montre l'exemple précédent, IoC vous permet de découpler votre programme en composants distincts qui ne se connaissent pas. L'une des versions les plus courantes d' IoC est Dependecy Injection .
Dans l' injection de dépendances, chaque composant doit déclarer une liste de dépendances nécessaires à l'exécution de sa tâche. Au moment de l'exécution, un composant spécial (généralement) appelé conteneur IoC établit une liaison entre ces composants. Il essaie de fournir des valeurs pour les dépendances des composants publiés.
Voici un exemple en pseudo-code:
Dans cet exemple, la classe
Foo
a un constructeur qui nécessite un argument de typeBoo
pour effectuer certaines actions.Vous pouvez créer une instance de classe en
Foo
utilisant un code similaire à celui-ci:MyContainer
- est un conteneur IoC , qui se charge d’obtenir une instance deBoo
et de la transmettre auFoo
constructeur.En résumé, IoC vous permet de découpler votre programme en plusieurs parties. C'est bien parce que:
Cependant, dans certains cas, IoC peut rendre le code plus difficile à comprendre.
Si vous voulez voir un bon exemple d'utilisation de l' IoC dans le monde réel , jetez un coup d'œil à Mircosoft Composite UI Application Block et CompositeWPF.
J'espère que mon explication vous aide.
Cordialement,
Aku
la source
Depuis que j'ai moi-même récemment exploré cela et gardé tous les signets, les éléments suivants m'ont été d'une grande utilité pour en savoir plus sur la COI / DI.
Article original de Martin Fowlers sur IOC / DI
Quelques concepts à connaître en premier
Une excellente collection de didacticiels CIO / DI
Livre sur CIO / DI de Manning Press
Source et explications sur la création de votre propre code IOC - Cause La lecture du code source est toujours le meilleur moyen de comprendre un concept.
la source
Bonjour JMS, IoC / DI vous permettra de définir quelle implémentation vous utiliserez une fois et de conserver une copie statique de votre conteneur à référencer chaque fois que vous souhaitez le référencer.
Wikipedia va probablement vous aider, mais je voulais faire référence à votre deuxième partie - oui, l'injection de dépendance peut être faite pour les classes (c'est-à-dire, chaque fois que ce type de classe doit être passé à une méthode, utilisez cette classe), mais il est préférable de utilisez des interfaces, car vous pourrez ainsi changer la version du fournisseur, du référentiel, etc. que vous utilisez simplement en le référençant de nouveau dans votre configuration.
IE, disons que vous aviez une interface pour lire un flux, et que vous aviez une implémentation XMLStreamReader et SQLStreamReader. Ensuite, vous pouvez passer la référence à l'interface de vos méthodes, puis lui indiquer dans votre conteneur IoC celle à utiliser.
Donc, vous pourriez avoir une liste publique ReadPeople (lecteur IStreamReader) et dans votre configuration pour votre conteneur IoC, indiquez-le, chaque fois que vous attendez un IStreamReader, utilisez SQLStreamReader.
Ensuite, si vous changez d'avis par la suite, il vous suffira de le changer à un endroit (la configuration de votre conteneur) et peu importe le nombre de méthodes qui demandent un IStreamReader, les valeurs par défaut que vous avez indiquées à votre conteneur seront toujours présentes. servir.
la source
Disons que vous avez un validateur pour vérifier si une entreprise est valide dans votre système. Votre "BusinessValidator" peut avoir un champ de type AddressValidator qui valide l'adresse faisant partie de l'entreprise. Si vous souhaitez tester BusinessValidator sans exécuter de code extérieur (c.-à-d. Le code addressValidator), si vous avez utilisé une sorte d'IoC / DI dans votre infrastructure, vous pouvez facilement "injecter" une fausse adresseValidator à sa place et ne pas avoir à vous soucier des tests. code en dehors du champ de la classe sous test.
la source