Qu'est-ce que l'inversion de contrôle et quand devrais-je l'utiliser?

Réponses:

62

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' listapplication de la ffonction à chacun de ses éléments. La Iteratorfonction 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 Fooa un constructeur qui nécessite un argument de type Boopour effectuer certaines actions.

Vous pouvez créer une instance de classe en Fooutilisant un code similaire à celui-ci:

MyContainer.Create(typeof Foo)

MyContainer- est un conteneur IoC , qui se charge d’obtenir une instance de Booet de la transmettre au Fooconstructeur.

En résumé, IoC vous permet de découpler votre programme en plusieurs parties. C'est bien parce que:

  • Les composants peuvent être facilement testés indépendamment.
  • La complexité du programme peut être réduite.
  • Vous pouvez passer des composants à une autre implémentation.

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
1
Cinq ans plus tard, mais quand même ... C'était une excellente description. Merci.
Nick Hodges
4
IoC ne mentionne pas beaucoup le fait que le code devient plus difficile à lire. La lisibilité est la priorité numéro un si vous voulez écrire un bon logiciel. Il bat même Testability. Vous pouvez découpler le code bien au-delà de son utilité.
Arne Evertsson
Ainsi, un code qui utilise une solution basée sur Interface pour toutes ses dépendances est également basé sur la conception IoC?
Nikel
18

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.

Kris Erickson
la source
4

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
3

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.

codeLes
la source