153 votes

L'injection de dépendance par les constructeurs ou les accesseurs de propriété?

J'espère que ce n'est pas un doublon. J'ai fait une recherche mais il y a beaucoup d'injection de dépendance messages et je ne pouvais pas trouver toutes les aiguilles dans la botte de foin.

Alors, voici ma question. Je suis refactoring d'une classe et l'ajout d'une nouvelle dépendance. La classe est en train de prendre ses dépendances dans le constructeur. Donc, par souci de cohérence, j'ai ajouté le paramètre du constructeur.

Bien sûr, il y a quelques sous-classes et même encore plus pour les tests unitaires, alors maintenant, je suis de jouer le jeu, aller dans modifier tous les constructeurs de match, et c'est prendre les âges.

Ça me fait penser qu'à l'aide des propriétés avec des poseurs est un meilleur moyen d'obtenir des dépendances. Je ne pense pas que l'injection de dépendances doit être une partie de l'interface à la construction d'une instance d'une classe. Vous ajouter une dépendance et maintenant, tous à vos utilisateurs (sous-classes de la personne de l'instanciation directement à vous) savez à ce sujet. Qui se sent comme une rupture de l'encapsulation.

Mais cela ne semble pas être le modèle avec le code existant ici, donc je suis à la recherche pour savoir ce que le consensus général est, pour + contre des constructeurs vs propriétés. Est l'aide de la propriété poseurs de mieux?

EDIT: Wow, beaucoup de réponses utiles dans un très court laps de temps. Ressemble le consensus est pour le constructeur.

129voto

sleske Points 29978

Eh bien, ça dépend :-).

Si la classe ne peut pas faire son travail w/o la dépendance, puis l'ajouter à la constructeur. La classe les besoins de la nouvelle dépendance, de sorte que vous voulez que votre changement de casser des choses. Aussi, la création d'une classe qui n'est pas entièrement initialisé ("deux étapes de la construction") est un anti-modèle (à mon humble avis).

Si la classe peut travailler w/o la dépendance, un setter est fine.

31voto

Dzmitry Huba Points 3333

Martin Fowler traite des options dans le Constructeur de rapport à l'Injection par Mutateur

Mise à jour: j'ai essayé de regarder à l'injection de dépendance ou de l'emplacement du point de vue d'un contrat et les dépendances de la durée de vie de mon blog Injecter ou de localiser les dépendances?

21voto

Scott Points 1622

Les utilisateurs d'une classe sont censés savoir sur les dépendances d'une classe donnée. Si j'avais une classe qui, par exemple, connecté à une base de données, et ne fournit pas un moyen pour injecter une couche de persistance de la dépendance, un utilisateur ne saura jamais que d'une connexion à la base de données devraient être disponibles. Cependant, si j'ai modifier le constructeur, je laisse les utilisateurs savent qu'il y a une dépendance sur la couche de persistance.

Aussi, pour vous empêcher d'avoir à changer à chaque utilisation de l'ancien constructeur, il suffit d'appliquer constructeur enchaînant comme un pont temporaire entre l'ancien et le nouveau constructeur.

public class ClassExample
{
    public ClassExample(IDependencyOne dependencyOne, IDependencyTwo dependencyTwo)
        : this (dependnecyOne, dependencyTwo, new DependnecyThreeConcreteImpl())
    { }

    public ClassExample(IDependencyOne dependencyOne, IDependencyTwo dependencyTwo, IDependencyThree dependencyThree)
    {
        // Set the properties here.
    }
}

L'un des points d'injection de dépendance est de révéler quelles sont les dépendances de la classe. Si la classe a de trop nombreuses dépendances, alors il peut être temps pour certains de refactoring: est-ce que chaque méthode de la classe à utiliser toutes les dépendances? Si non, alors c'est un bon point de départ pour voir où la classe peut être divisée.

18voto

Joe Points 18328

Bien sûr, la mise sur le constructeur signifie que vous pouvez valider une fois pour toutes. Si vous affectez des choses dans les champs en lecture seule, alors vous avez quelques garanties sur l'objet de dépendances droit de la construction et de temps.

C'est une vraie douleur de l'ajout de nouvelles dépendances, mais au moins de cette façon, le compilateur garde de se plaindre jusqu'à ce qu'elle est correcte. Ce qui est une bonne chose, je pense.

11voto

epitka Points 6258

Si vous avez un grand nombre de dépendances optionnelles (ce qui est déjà une odeur), puis probablement à l'injection par mutateur est le chemin à parcourir. Constructeur injection mieux révèle vos dépendances.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X