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?
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?
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:
void Iterator(void *list, Func* f)
Ce qui itère sur l' list
application de la f
fonction à chacun de ses éléments. La Iterator
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:
class Foo
{
<Require Boo>Constructor(Boo boo){ boo.DoSomething }
}
Dans cet exemple, la classe Foo
a un constructeur qui nécessite un argument de type Boo
pour effectuer certaines actions.
Vous pouvez créer une instance de classe en Foo
utilisant un code similaire à celui-ci:
MyContainer.Create(typeof Foo)
MyContainer
- est un conteneur IoC , qui se charge d’obtenir une instance de Boo
et de la transmettre au Foo
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
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.
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.
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.