Question

J'ai été en utilisant StructureMap récemment et ont apprécié l'expérience à fond.Cependant, je peux voir comment on peut facilement se laisser emporter par l'interfaçage tout et jusqu'à la fin avec des classes qui prennent une cargaison d'interfaces dans leurs constructeurs.Même si ce n'est pas vraiment un énorme problème lorsque vous utilisez un framework injection de dépendance, il se sent toujours qu'il y a certaines propriétés qui n'ont pas vraiment besoin d'être interfacé juste pour le plaisir de les relier.

Où puisez-vous la ligne sur ce à l'interface de sortie vs juste l'ajout d'une propriété à la classe?

Était-ce utile?

La solution

Pensez à votre conception.DI vous permet de modifier la façon dont vos fonctions de code via des modifications de configuration.Il vous permet également de briser les dépendances entre les classes de sorte que vous pouvez isoler et de tester des objets plus faciles.Vous devez déterminer où cela a un sens et où il n'est pas.Il n'y a pas de réponse de tapotement.

Une bonne règle de base est que si c'est trop dur pour tester, vous avez quelques problèmes avec la responsabilité unique et statique dépendances.Isoler le code qui effectue une seule fonction dans une classe et de briser statique de la dépendance par l'extraction d'une interface et à l'aide d'un DI-cadre pour injecter le bon exemple au moment de l'exécution.En faisant cela, vous faites, il est trivial de tester les deux parties séparément.

Autres conseils

Le principal problème avec l'injection de dépendance est que, bien qu'il donne l'apparence d'une architecture faiblement couplée, il n'a vraiment pas.

Ce que vous êtes vraiment en train de faire est de déplacer ce couplage à partir du moment de la compilation à l'exécution, mais encore si la classe A besoin d'une certaine interface B de travail, une instance d'une classe qui implémente l'interface B doit encore être fournis.

L'injection de dépendance doit être utilisé uniquement pour les parties de la demande qui doivent être modifiés dynamiquement sans avoir à recompiler le code de base.

Les utilisations que j'ai vu utiles pour une Inversion de modèle de Contrôle:

  • Une architecture de plugin.Donc en faisant les bons points d'entrée, vous pouvez définir le contrat pour le service qui doit être fourni.
  • Les flux de travail comme de l'architecture.Où vous pouvez vous connecter à plusieurs composants dynamiquement la connexion de la sortie d'un composant à l'entrée d'un autre.
  • Chaque client de l'application.Disons que vous avez de différents clients qui paye pour un jeu de "caractéristiques" de votre projet.En utilisant l'injection de dépendance, vous pouvez facilement fournir les composants de base et certains ", a ajouté," les éléments qui fournit seulement les fonctionnalités que le client a payé.
  • La traduction.Bien que ce n'est généralement pas effectuée à des fins de traduction, vous pouvez "injecter" les différents fichiers de langue selon les besoins de l'application.Qui comprend RTL ou LTR interfaces utilisateur en tant que de besoin.

L'injection de dépendance doit être utilisé uniquement pour les parties de la application qui doivent être modifiés dynamiquement sans avoir à recompiler le code de base

DI doit être utilisé pour isoler votre code à partir de ressources externes (bases de données, webservices, xml, architecture de plugin).La quantité de temps qu'il faudrait pour tester votre logique dans le code serait presque prohibitif à un grand nombre de sociétés si l'on analyse des composants qui DÉPENDENT d'une base de données.

Dans la plupart des applications de la base de données ne va pas changer de manière dynamique (si on peut) mais en général c'est presque toujours de bonne pratique de ne PAS lier votre application à une ressource externe.Le montant impliquer dans l'évolution des ressources devrait être faible (classes d'accès aux données nécessite rarement une complexité cyclomatique au-dessus de l'un dans les méthodes).

Qu'entendez-vous par "juste l'ajout d'une propriété à une classe?"

Ma règle d'or est de faire de la classe de l'unité vérifiable.Si votre classe s'appuie sur la mise en œuvre d'une autre classe, qui doit être remaniée/soustrait au point que les classes peuvent être testés séparément.

EDIT:Vous mentionnez une cargaison d'interfaces dans le constructeur.Je conseille à l'aide de setters/getters à la place.Je trouve que ça rend les choses beaucoup plus facile à maintenir dans le long terme.

Je le fais seulement quand elle contribue à la séparation des préoccupations.

Comme peut-être la croix-projet, j'ai une interface pour les responsables de l'implémentation dans un de mes projet de bibliothèque et de la mise en œuvre du projet permettrait d'injecter quelle que soit mise en œuvre spécifique qu'ils veulent dans la.

Mais c'est tout...tous les autres cas, il venait de rendre le système inutilement complexe

Même avec tous les faits et les processus dans le monde..chaque décision se résume à un appel de jugement - Oublié où j'ai lu que
Je pense que c'est plus une expérience de vol / temps d'appel.Fondamentalement, si vous voyez de la dépendance en tant que candidat de l'objet qui peut être remplacé dans un avenir proche, utiliser l'injection de dépendance.Si je vois 'classA et de ses dépendances" comme un bloc de substitution, alors je n'aurai probablement pas utiliser DI pour le deps.

Le plus grand avantage est que cela va vous aider à comprendre ou même découvrir l'architecture de votre application.Vous serez en mesure de voir très clairement comment votre dépendance des chaînes de travail et être en mesure de faire des modifications à chacune des parties, sans vous obliger à changer les choses qui ne sont pas liés.Vous vous retrouverez avec un couplage lâche application.Cela va vous pousser à une meilleure conception et vous serez surpris quand vous pouvez continuer à faire les améliorations parce que votre design vous aidera à garder la séparation et l'organisation code d'aller de l'avant.Il peut également faciliter les tests unitaires, car vous avez maintenant un moyen naturel pour remplacer les implémentations de particulier interfaces.

Il y a quelques applications qui sont juste jetables, mais si il y a un doute que je puisse aller de l'avant et de créer les interfaces.Après un peu de pratique c'est pas vraiment un fardeau.

Un autre élément, je me débats avec est où dois-je utiliser l'injection de dépendance? Où prenez-vous votre dépendance sur StructureMap?Seulement dans l'application de démarrage?Est-ce à dire toutes les implémentations doivent être remis vers le bas à partir du haut de la plupart de la couche vers le bas-la plupart de la couche?

J'utilise Château de Windsor/micro-noyau, je n'ai aucune expérience avec quoi que ce soit d'autre, mais je l'aime beaucoup.

Comme pour comment décidez-vous à injecter?Jusqu'à présent, la règle suivante m'a bien servi:Si la classe est tellement simple qu'il n'a pas besoin de tests unitaires, vous pouvez vous sentir libre de l'instancier dans la classe, sinon, vous voudrez probablement avoir une dépendance par le constructeur.

Quant à savoir si vous devez créer une interface vs juste faire vos méthodes et propriétés virtuel je pense que vous devriez aller de l'interface itinéraire si vous avez un) peut voir la classe ont un certain niveau de réutilisabilité dans une autre application (c'est à direun enregistreur) ou b) si, soit en raison de la quantité de paramètres du constructeur ou parce qu'il ya une quantité significative de logique dans le constructeur de la classe est difficile à simuler.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top