327 votes

Comment éviter la folie constructeur Injection de dépendance ?

Je trouve que mon constructeurs commencent à ressembler à ceci :

avec toujours plus de liste de paramètres. « Conteneur » étant mon conteneur d’injection de dépendance, pourquoi ne peux pas je viens de faire ceci :

pour chaque classe ? Quels sont les inconvénients ? Si je fais cela, il se sent comme j’utilise un statique glorifié. S’il vous plaît Partagez vos impressions sur la folie du CIO et Injection de dépendance.

445voto

Mark Seemann Points 102767

Vous avez raison, si vous utilisez le conteneur comme un Localisateur de Service, c'est plus ou moins glorieux statique de l'usine. Pour des tas de raisons, je considère cela comme un anti-modèle.

L'un des merveilleux avantages de Constructeur d'Injection est qu'il rend les violations du Principe de Responsabilité Unique évidente.

Quand cela arrive, il est temps de refactoriser de Façade Services. En bref, créer un nouveau, plus grossière de l' interface qui cache l'interaction entre certains ou de la totalité de la fine des dépendances vous avez besoin.

68voto

derivation Points 1399

Je ne pense pas que les constructeurs de votre classe doivent avoir une référence à votre période de conteneur IOC. Il s’agit d’une dépendance inutile entre votre classe et le contenant (le type de dépendance QU'IOC cherche à éviter !).

28voto

kyoryu Points 8281

La difficulté de passage de paramètres n’est pas le problème. Le problème est que votre classe est fait trop et plus doit être ventilée.

Injection de dépendance peut agir comme un avertissement précoce pour les classes devient trop grand, précisément à cause de la douleur croissante de passage dans toutes les dépendances.

-8voto

David W Crook Points 13

Ce que l'injection de dépendance cadre utilisez-vous? Avez-vous essayé d'utiliser poseur d'injection à la place?

L'avantage pour le constructeur d'injection, c'est qu'il semble naturel pour les programmeurs Java qui n'utilisent pas DI cadres. Vous avez besoin de 5 choses à initialiser une classe, alors vous avez 5 arguments en faveur de votre constructeur. L'inconvénient est que vous l'avez remarqué, il devient difficile lorsque vous avez beaucoup de dépendances.

Avec le Printemps, vous pouvez transmettre les valeurs requises avec les poseurs de la place, et vous pouvez utiliser @annotations nécessaires afin de faire respecter ce qu'ils sont injectés. L'inconvénient est que vous devez déplacer le code d'initialisation du constructeur à l'autre méthode et ont de Printemps de l'appel qu'après que toutes les dépendances sont injectés par marquage avec @PostConstruct. Je ne suis pas sûr d'autres cadres, mais je suppose qu'ils font quelque chose de similaire.

Les deux façons de travailler, c'est une question de préférence.

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