6
votes

Quelles dépendances devrais-je injecter?

Lors de l'utilisation d'une injection de dépendance Quelles dépendances injjuxez-vous?

J'ai déjà injecté toutes les dépendances mais que vous avez constatée lors de la réalisation de TDD, il y a généralement deux types de dépendance:

  • Ceux qui sont de véritables dépendances externes qui peuvent changer par ex. Producteur producteur
  • ceux qui existent uniquement pour la qualification par ex. Une partie du comportement de la classe extraite et injectée juste pour la qualification

    Une approche consiste à injecter toutes les dépendances telles que celles-ci xxx

    mais j'ai constatées que cela peut causer de la dépendance au greffe de DI.

    Une autre approche consiste à masquer la "dépendance de la testabilité" comme celle-ci xxx

    C'est plus d'effort mais semble faire beaucoup plus de sens. L'inconvénient n'est pas que tous les objets sont configurés dans le cadre DI, ce qui enfreint une "meilleure pratique" que j'ai entendue.

    Quelle approche préconiseriez-vous et pourquoi?


0 commentaires

3 Réponses :


1
votes

Je pense que vous feriez mieux d'injecter toutes vos dépendances. Si cela commence à obtenir un peu lourd, c'est probablement une indication que vous devez simplifier les choses un peu ou déplacer les dépendances dans un autre objet. Sentant la "douleur" de votre conception comme vous pouvez être vraiment éclairant.

En ce qui concerne le gonflement de la dépendance dans le registre, vous pouvez envisager d'utiliser une sorte de technique de liaison classique plutôt que d'enregistrer chaque dépendance à la main. Certains conteneurs de la COI ont des liaisons de numérisation de type à base de convention intégrées à elles. Par exemple, voici une partie d'un module que j'utilise dans une application Caliburn WPF qui utilise Niject: xxx

même si j'ai des dizaines de résultats et de présentateurs courants, je ne fais pas doivent les enregistrer explicitement.


0 commentaires

0
votes

Je n'entraînerai certainement pas toutes les dépendances, car devaient arrêter? Voulez-vous injecter votre string dépendances? Je n'inversion que les dépendances dont j'ai besoin pour des tests unitaires. Je veux balancer ma base de données (voir Cet exemple par exemple). Je veux aborder l'envoi d'e-mails. Je veux faire face à l'horloge système. Je veux basculer écrire au système de fichiers.

La chose à propos de l'inverser autant de dépendances que vous pouvez, même celles que vous n'avez pas besoin de tester, c'est que l'unité teste beaucoup plus fort et plus vous stiperez moins vous testez vraiment comment le système agit vraiment. Cela rend vos tests beaucoup moins fiables. Il complique également votre configuration DI dans la racine d'application.


2 commentaires

L'un des avantages de l'inversion des dépendances est de pouvoir tester des unités isolées. Je peux extraire une classe de calculatrice pour le tester en isolement, mais peut-être que cela n'a pas besoin d'injection (voir exemple de code de code). Je ne pouvais pas le tester in situ car elle battrait les tests du client de la classe de calculatrice.


Injectez tous les injectables, de nouveaux neufs. Sans cette distinction, DI nécessiterait tous les objets vivant pendant toute la durée du programme. Les nouveautables, aka types de valeur, représentent des données inertes et éventuellement certains comportements de transformation associés (c'est-à-dire des méthodes qui prennent des valeurs et renvoient de nouvelles valeurs). Injectables, types de services / entreprises, représentent des fonctionnalités et éventuellement un État de programme associé. Sans doute, nous avons également des types d'E / S pour représenter un État externe, par exemple. Déposer(). Les types d'E / S doivent être neufs mais doivent être créés par des usines abstraites afin qu'elles puissent être moquées pour le test.



0
votes

Je ferais des câbles toutes mes dépendances non externes à la main et «enregistrer» seules des dépendances externes. Lorsque je dis non-externe, je veux dire les objets qui appartiennent à mon composant et qui ont été extraits pour interfaces pour des raisons de responsabilités ou de testabilité unique, je n'aurais jamais d'autres implémentations de telles interfaces jamais. Les dépendances externes sont des trucs comme des connexions DB, des services Web, des interfaces qui n'appartiennent pas à mon composant. Je les enregistrerais en tant qu'interfaces car leurs implémentations peuvent être commutées sur des tests d'intégration. Avoir un petit nombre de composants enregistrés dans un conteneur DI rend le code DI plus facile à lire et à bloquer gratuitement.


0 commentaires