Je me suis intéressé aux termes d'injection de constructeur et d'injection de dépendance en passant en revue des articles sur les modèles de conception (service locator).
Quand j'ai cherché sur Google à propos de l'injection de constructeur, j'ai eu des résultats incertains, ce qui m'a incité à vérifier ici.
Qu'est-ce que l'injection de constructeur? Est-ce un type spécifique d'injection de dépendance? Un exemple canonique serait d'une grande aide!
Modifier
En revenant sur ces questions après un intervalle d'une semaine, je peux voir à quel point j'étais perdue ... Juste au cas où quelqu'un d'autre se présenterait ici, je mettrai à jour le corps de la question avec un peu d'apprentissage, le mien. S'il vous plaît n'hésitez pas à commenter / corriger. L'injection de constructeur et l'injection de propriété sont deux types d'injection de dépendance.
la source
Réponses:
Je ne suis pas un expert, mais je pense pouvoir aider. Et oui, il s’agit d’un type spécifique d’injection de dépendance.
Disclaimer: Presque tout cela a été "volé" du Wiki Ninject
Examinons l'idée d'injection de dépendance en passant à travers un exemple simple. Disons que vous écrivez le prochain jeu à succès, où de nobles guerriers se battent pour la plus grande gloire. Premièrement, nous aurons besoin d’une arme appropriée pour armer nos guerriers.
Ensuite, créons une classe pour représenter nos guerriers eux-mêmes. Afin d'attaquer ses ennemis, le guerrier aura besoin d'une méthode Attack (). Lorsque cette méthode est appelée, il doit utiliser son épée pour frapper son adversaire.
Maintenant, nous pouvons créer nos samouraïs et combattre!
Comme vous pouvez l'imaginer, cela imprimera Chopped les malfaiteurs propres en deux sur la console. Cela fonctionne très bien, mais si nous voulions armer notre Samouraï avec une autre arme? Puisque l’épée est créée dans le constructeur de la classe Samurai, nous devons modifier l’implémentation de la classe pour pouvoir effectuer ce changement.
Lorsqu'une classe dépend d'une dépendance concrète, on dit qu'elle est étroitement liée à cette classe . Dans cet exemple, la classe Samurai est étroitement associée à la classe Sword. Lorsque les classes sont étroitement associées, elles ne peuvent pas être échangées sans modifier leur implémentation. Afin d'éviter un couplage étroit des classes, nous pouvons utiliser des interfaces pour fournir un niveau d'indirection. Créons une interface pour représenter une arme dans notre jeu.
Ensuite, notre classe Sword peut implémenter cette interface:
Et nous pouvons modifier notre classe de samouraï:
Maintenant, nos samouraïs peuvent être armés de différentes armes. Mais attendez! L'épée est toujours créée à l'intérieur du constructeur de Samurai. Comme nous devons encore modifier la mise en œuvre de Samurai afin de donner une autre arme à notre guerrier, Samurai est toujours étroitement lié à Sword.
Heureusement, il existe une solution facile. Plutôt que de créer l'épée à partir du constructeur de Samurai, nous pouvons l'exposer en tant que paramètre du constructeur. Également connu sous le nom d'injection de constructeur.
Comme l'a souligné Giorgio, il existe également une injection de propriété. Ce serait quelque chose comme:
J'espère que cela t'aides.
la source
Je vais essayer autant que possible de rendre cela très élémentaire. De cette façon, vous pouvez développer le concept et créer vos propres solutions ou idées complexes.
Maintenant, imaginez que nous ayons une église appelée Jubilee, qui a des branches dans le monde entier. Notre objectif est de simplement obtenir un article de chaque branche. Voici la solution avec DI;
1) Créer une interface IJubilee:
2) Créez une classe JubileeDI qui prendrait l’interface IJubilee en tant que constructeur et renverrait un élément:
3) Créez maintenant trois branches de Jubile, à savoir JubileeGT, JubileeHOG et JubileeCOV, qui DOIVENT toutes hériter de l'interface IJubilee. Pour le plaisir, demandez à l’un d’eux d’implémenter sa méthode de manière virtuelle:
4) C'est ça! Voyons maintenant DI en action:
Pour chaque instance de la classe conteneur, nous passons une nouvelle instance de la classe dont nous avons besoin, ce qui permet un couplage lâche.
J'espère que cela explique le concept en quelques mots.
la source
Supposons que vous ayez une classe dont
A
chaque instance nécessite une instance d'une autre classeB
.L'injection de dépendance signifie que la référence à
B
est définie par l'objet qui gère l'instance deA
(au lieu que la classeA
gèreB
directement la référence ).L'injection de constructeur signifie que la référence à
B
est passée en tant que paramètre au constructeur deA
et définie dans le constructeur:Une alternative consiste à utiliser une méthode de définition (ou une propriété) pour définir la référence
B
. Dans ce cas, l'objet qui gère une instancea
deA
doit d'abord appeler le constructeur deA
, puis appeler la méthode setter pour définir la variable membreA.b
avant qu'elle nea
soit utilisée. Cette dernière méthode d'injection est nécessaire lorsque les objets contiennent des références cycliques, par exemple si une instanceb
deB
celle-ci est définie dans une instancea
deA
contient une référence arrière àa
.** MODIFIER**
Voici quelques détails supplémentaires pour répondre au commentaire.
1. La classe A gère l'instance B
2. L'instance B est définie dans le constructeur
3. L'instance B est définie à l'aide de la méthode de définition
la source
itemA
ouobjectA
juste pour le nom est plus pas toujours mieux.