Demasiadas dependencias pueden indicar que la clase misma está haciendo demasiado. Para determinar si no está haciendo demasiado:
Al observar las dependencias reales, no veo nada que sea indicativo de que sucedan cosas malas:
IDbContextFactory: crea el contexto para la base de datos.
OK, probablemente estamos dentro de una capa empresarial donde las clases interactúan con la capa de acceso a datos. Se ve bien.
IMapper: asignación de entidades a modelos de dominio.
Es difícil decir algo sin la imagen general. Es posible que la arquitectura sea incorrecta y que la capa de acceso a los datos se haga directamente, o que la arquitectura esté perfectamente bien. En todos los casos, tiene sentido tener esta dependencia aquí.
Otra opción sería dividir la clase en dos: una que se ocupa del mapeo, la otra que se ocupa de la lógica comercial real. Esto crearía una capa de facto que separará aún más el BL del DAL. Si las asignaciones son complejas, podría ser una buena idea. Sin embargo, en la mayoría de los casos, solo agregaría una complejidad inútil.
IClock - Abstracts DateTime. Ahora para ayudar con las pruebas unitarias.
Probablemente no sea muy útil tener una interfaz (y clase) separada solo para obtener la hora actual. Simplemente pasaría DateTime.Nowa los métodos que requieren la hora actual.
Una clase separada puede tener sentido si hay alguna otra información, como las zonas horarias o los rangos de fechas, etc.
IPerformanceFactory: mide el tiempo de ejecución de métodos específicos.
Ver el siguiente punto.
ILog: Log4net para iniciar sesión.
Dicha funcionalidad trascendente debería pertenecer al marco, y las bibliotecas reales deberían ser intercambiables y configurables en tiempo de ejecución (por ejemplo, a través de app.config en .NET).
Desafortunadamente, este no es (todavía) el caso, lo que le permite elegir una biblioteca y seguir con ella, o crear una capa de abstracción para poder intercambiar las bibliotecas más adelante si es necesario. Si su intención es específicamente ser independiente de la elección de la biblioteca, hágalo. Si está seguro de que continuará usando la biblioteca durante años, no agregue una abstracción.
Si la biblioteca es demasiado compleja de usar, tiene sentido un patrón de fachada.
ICollectionWrapperFactory: crea colecciones (que amplía IEnumerable).
Supongo que esto crea estructuras de datos muy específicas que son utilizadas por la lógica de dominio. Parece una clase de utilidad. En su lugar, use una clase por estructura de datos con constructores relevantes. Si la lógica de inicialización es un poco complicada para encajar en un constructor, utilice métodos de fábrica estáticos. Si la lógica es aún más compleja, use el patrón de fábrica o de construcción.
IQueryFilterFactory: genera consultas basadas en la entrada que consultará db.
¿Por qué no está eso en la capa de acceso a datos? ¿Por qué hay un Filteren el nombre?
IIdentityHelper: recupera el usuario conectado.
No estoy seguro de por qué hay un Helpersufijo. En todos los casos, otros sufijos tampoco serán particularmente explícitos ( IIdentityManager?)
De todos modos, tiene mucho sentido tener esta dependencia aquí.
IFaultFactory: crea diferentes FaultExceptions (uso WCF).
¿Es la lógica tan compleja que requiere usar un patrón de fábrica? ¿Por qué se usa la inyección de dependencia para eso? ¿Cambiaría la creación de excepciones entre el código de producción y las pruebas? ¿Por qué?
Intentaría refactorizar eso en simple throw new FaultException(...). Si se debe agregar alguna información global a todas las excepciones antes de propagarlas al cliente, WCF probablemente tenga un mecanismo donde detecte una excepción no controlada y pueda cambiarla y volver a lanzarla al cliente.
Medir la calidad por números suele ser tan malo como ser pagado por las líneas de código que escribe por mes. Es posible que tenga una gran cantidad de dependencias en una clase bien diseñada, ya que puede tener una clase mala con pocas dependencias.
Muchas dependencias hacen que la lógica sea más difícil de seguir. Si la lógica es difícil de seguir, la clase probablemente esté haciendo demasiado y debería dividirse.