Trop de dépendances peuvent indiquer que la classe elle-même en fait trop. Afin de déterminer si cela ne fait pas trop:
En regardant les dépendances réelles, je ne vois rien qui pourrait indiquer que de mauvaises choses se produisent:
IDbContextFactory - création du contexte pour la base de données.
OK, nous sommes probablement dans une couche métier où les classes interagissent avec la couche d'accès aux données. Semble bien.
IMapper - Mappage des entités aux modèles de domaine.
Il est difficile de dire quoi que ce soit sans l'image globale. Il se peut que l'architecture soit incorrecte et que le mappage soit effectué directement par la couche d'accès aux données, ou il se peut que l'architecture soit parfaitement correcte. Dans tous les cas, il est logique d'avoir cette dépendance ici.
Un autre choix serait de diviser la classe en deux: l'un traitant de la cartographie, l'autre de la logique métier actuelle. Cela créerait une couche de facto qui séparera davantage le BL du DAL. Si les mappages sont complexes, ce pourrait être une bonne idée. Dans la plupart des cas, cependant, cela ne ferait qu'ajouter une complexité inutile.
IClock - Abstracts DateTime.Now pour aider avec les tests unitaires.
Il n'est probablement pas très utile d'avoir une interface (et une classe) séparée juste pour obtenir l'heure actuelle. Je passerais simplement le DateTime.Now
aux méthodes qui nécessitent l'heure actuelle.
Une classe distincte peut avoir du sens s'il existe d'autres informations, comme les fuseaux horaires ou les plages de dates, etc.
IPerformanceFactory - mesure le temps d'exécution pour des méthodes spécifiques.
Voir le point suivant.
ILog - Log4net pour la journalisation.
Ces fonctionnalités transcendantes doivent appartenir au cadre et les bibliothèques réelles doivent être interchangeables et configurables au moment de l'exécution (par exemple via app.config dans .NET).
Malheureusement, ce n'est pas (encore) le cas, ce qui vous permet soit de choisir une bibliothèque et de vous y tenir, soit de créer une couche d'abstraction pour pouvoir échanger les bibliothèques plus tard si nécessaire. Si votre intention est précisément d'être indépendant du choix de la bibliothèque, allez-y. Si vous êtes sûr que vous continuerez à utiliser la bibliothèque pendant des années, n'ajoutez pas d'abstraction.
Si la bibliothèque est trop complexe à utiliser, un motif de façade est logique.
ICollectionWrapperFactory - Crée des collections (qui étend IEnumerable).
Je suppose que cela crée des structures de données très spécifiques qui sont utilisées par la logique du domaine. Cela ressemble à une classe utilitaire. Utilisez plutôt une classe par structure de données avec les constructeurs appropriés. Si la logique d'initialisation est légèrement compliquée à intégrer dans un constructeur, utilisez des méthodes d'usine statiques. Si la logique est encore plus complexe, utilisez un modèle d'usine ou un modèle de générateur.
IQueryFilterFactory - Génère des requêtes basées sur l'entrée qui interrogera db.
Pourquoi n'est-ce pas dans la couche d'accès aux données? Pourquoi y a-t-il un Filter
dans le nom?
IIdentityHelper - Récupère l'utilisateur connecté.
Je ne sais pas pourquoi y a-t-il un Helper
suffixe. Dans tous les cas, les autres suffixes ne seront pas particulièrement explicites non plus ( IIdentityManager
?)
Quoi qu'il en soit, il est parfaitement logique d'avoir cette dépendance ici.
IFaultFactory - Créer différentes FaultExceptions (j'utilise WCF).
La logique est-elle si complexe qu'elle nécessite d'utiliser un modèle d'usine? Pourquoi l'injection de dépendance est-elle utilisée pour cela? Souhaitez-vous échanger la création d'exceptions entre le code de production et les tests? Pourquoi?
J'essaierais de refaçonner cela en simple throw new FaultException(...)
. Si des informations globales doivent être ajoutées à toutes les exceptions avant de les propager au client, WCF dispose probablement d'un mécanisme permettant d'attraper une exception non gérée et de la modifier et de la renvoyer au client.
Mesurer la qualité par des chiffres est généralement aussi mauvais que d'être payé par des lignes de code que vous écrivez par mois. Vous pouvez avoir un grand nombre de dépendances dans une classe bien conçue, car vous pouvez avoir une classe de merde utilisant peu de dépendances.
De nombreuses dépendances rendent la logique plus difficile à suivre. Si la logique est difficile à suivre, la classe en fait probablement trop et devrait être divisée.