7
votes

Injection de dépendance: Que perdez-vous lors de l'instanciation des classes concrètes dans le constructeur sans paramètre

En règle générale, mes dépendances sont résumées aux interfaces, mais je n'utiliserai qu'une seule implémentation concrète lors de l'utilisation sans test. Par exemple, j'étais pour écrire un fooservice : xxx

Maintenant, les puristes ont tendance à haleter en horreur, car j'ai instancié une classe de béton dans le constructeur sans paramètre. J'ai eu, dans le passé, haussa cela, parce que je sais que la seule fois où je n'utiliserai pas la classe de béton, c'est quand je suis des tests unitaires et des dépendances moqueurs.

alors qu'il coule le Fooservice classe dans la catégorie BardePendance , ce n'est pas un couplage étanche; Ces classes et interfaces existent également dans la même assemblée. Il ne me semble donc pas que je perds beaucoup d'ici, ou de me peindre dans un coin. Je peux toujours tester facilement la classe fooservice sans obtenir de code ingérable, simplement en utilisant le constructeur qui me permet de passer des interfaces moquées.

donc la question est la suivante: qu'est donc la question risque ici? Qu'est-ce que je perds avec ce type de motif qui vaut la peine d'ajouter un conteneur de COI?


1 commentaires

J'utilise la même approche dans les petits projets. DI et d'autres règles «faire du droit» font généralement de petits projets trop complexes. Bien sûr, cela apporte beaucoup d'avantages, mais cela ne vaut pas toujours le problème.


3 Réponses :


6
votes

Gestion à vie, par exemple. Peut-être que vous utilisez BARDPENDENCE Tout au long de votre code et que vous souhaitez que une instance soit en vie. Vous ne pouvez pas faire cela si chaque utilisateur crée ses propres instances.

Vous devez également trouver tous les usages de Nouvelle BardePendance () Si vous souhaitez le remplacer par Nouveau NewbardePendance () .

Un conteneur corrige les deux problèmes pour vous, car vous configurez ensuite l'instanciation et la vie de cycle de vie d'objets dans une méthode, à savoir où vous configurez votre conteneur.


2 commentaires

Vous suggérez donc que le conteneur de COI est mieux adapté à l'injection de modèle singleton? Ça a du sens.


Oui, vous pouvez utiliser une durée de vie "une fois par AppDomain", de sorte que vous n'avez pas besoin de singletons ou de classes statiques.



1
votes

Ce que vous perdez sans injection de dépendance est la capacité de centraliser tous les aspects de la gestion des dépendances. Visualisant le graphique de dépendance et la gestion desecycles de vos objets est plus facile lorsque vous disposez de toutes les informations au même endroit, au lieu de dispersées sur tout le code.

Un exemple concret serait si vous souhaitiez remplacer la mise en œuvre par défaut de ibardependency utilisé dans certains, mais pas toutes les classes. Raisonnement sur lequel remplacer est beaucoup plus facile si les dépendances sont toutes câblées dans le même fichier ou dans le même groupe de fichiers.


0 commentaires

2
votes

Cela dépend, mais si le point de fooservice doit être accédé par un autre développeur, la dépendance à la bardespendance sera fondamentalement cachée. À mon avis, non seulement la moqueur et les tests sont la raison de l'utilisation d'une injection de dépendance, mais également d'une indication claire, ce qui est utilisé par Certaing Classes et ce dont ils sont nécessaires pour fonctionner correctement. Et peut-être que je suis beaucoup puriste, mais lorsque ce modèle est correct, il est facile d'aller plus loin et de finir avec un code totalement étroitement couplé et maintien.


0 commentaires