Dans le livre "Dependency Injection in .Net", je sais que le graphe d'objet doit être créé à l'emplacement racine de Composition de l'application, ce qui me semble tout à fait logique lorsque vous utilisez un conteneur IoC.
Dans toutes les applications que j'ai vues lors d'une tentative d'utilisation de DI, il y a toujours deux constructeurs: l'un avec les dépendances en tant que paramètres et l'autre "default" sans paramètres qui appelle à son tour l'autre "newing" toutes les dépendances, mais, dans le livre susmentionné, cela s'appelle "l'anti-modèle Bastard Injection" et c'est ce que je connaissais sous le nom de "Injection du pauvre homme".
Maintenant, considérant tout cela, je dirais alors que "Poor Man's Injection" n’utiliserait tout simplement pas un conteneur IoC et coderait à la main tout le graphe d’objet à la main sur ladite Composition Root .
Donc mes questions sont:
Merci
En matière de DI, il y a beaucoup d'utilisation conflictuelle de la terminologie. Le terme Poor Man's DI ne fait pas exception. Pour certaines personnes, cela signifie une chose et pour d'autres, cela signifie quelque chose de différent.
Une des choses que je voulais faire avec le livre était de fournir un langage de motif cohérent pour DI. Quand il s'agissait de tous ces termes avec une utilisation conflictuelle, j'avais deux options: proposer un terme complètement nouveau ou choisir l'usage le plus courant (selon mon jugement subjectif).
En général, j'ai préféré réutiliser la terminologie existante au lieu de créer un langage de motif complètement nouveau (et donc étranger). Cela signifie que dans certains cas (comme le DI de Poor Man), vous pouvez avoir une notion différente de ce que le nom est que la définition donnée dans le livre. Cela arrive souvent avec des modèles de livre.
Au moins, je trouve rassurant que le livre semble avoir bien expliqué son travail en expliquant à la fois PID Man's DI et Bastard Injection, car l’interprétation donnée dans O.P. est exacte.
En ce qui concerne le bénéfice réel d’un conteneur DI, je vous renvoie à cette réponse: Arguments contre l’inversion des conteneurs de contrôle
PS 2018-04-13: Je tiens à souligner qu'il y a des années que je viens de reconnaître que le terme Poor Man's DI fait un travail médiocre (sic!) communiquant l’essence du principe, c’est pourquoi, pendant des années, j’ai je l’ai appelé à la place de Pure DI .
Quelques notes à la partie 2) de la question.
Si vous devez toujours enregistrer toutes les dépendances dans le conteneur IoC et les coder manuellement dans la même racine de composition, quel est le véritable avantage de l'utilisation d'un conteneur IoC?
Si vous avez une arborescence de dépendances (classe qui dépend de dépendances qui dépendent d'autres dépendances, etc.): vous ne pouvez pas faire toutes les "nouvelles" d'une racine de composition, car vous créez de nouvelles instances à chaque "injection de bâtard" constructeur de chaque classe, il existe donc de nombreuses "racines de composition" réparties le long de votre base de code
Que vous ayez ou non une arborescence de dépendances, l’utilisation d’un conteneur IoC vous évitera de saisir du code. Imaginez que vous avez 20 classes différentes qui dépendent de la même IDependency
. Si vous utilisez un conteneur, vous pouvez fournir une configuration lui permettant de savoir quelle instance utiliser pour IDependency
. Cela se fera à un endroit unique et le conteneur veillera à fournir l'instance dans toutes les classes dépendantes.
Le conteneur peut également contrôler la durée de vie de l'objet, ce qui offre un autre avantage.
Tout cela, mis à part les autres avantages évidents fournis par DI (testabilité, maintenabilité, découplage de code, extensibilité ...)
Nous avons constaté, lors de la refactorisation d'applications héritées et du découplage des dépendances, que les choses ont tendance à être plus faciles lorsque le processus est exécuté en deux étapes. Le processus inclut à la fois les systèmes de conteneur "pauvres" et les systèmes de conteneur IoC formels.
Premièrement: configurez les interfaces et établissez des "médiocres hommes" pour les implémenter.
Deuxièmement: chaque système IoC a des avantages et des inconvénients.