Al diseñar un sistema a menudo me enfrento con el problema de tener un montón de módulos (registro, acceso a bases de datos, etc.) que están siendo utilizados por los otros módulos. La pregunta es, ¿cómo hago para proporcionar estos componentes a otros componentes? Dos respuestas parecen ser posibles la inyección de dependencia o el uso del patrón de fábrica. Sin embargo, ambos parecen estar equivocados:
- Las fábricas dificultan las pruebas y no permiten un intercambio fácil de implementaciones. Tampoco hacen aparentes las dependencias (por ejemplo, estás examinando un método, sin tener en cuenta el hecho de que llama a un método que llama a un método que llama a un método que utiliza una base de datos).
- La inyección de Dependecy aumenta enormemente las listas de argumentos de los constructores y mancha algunos aspectos en todo el código. La situación típica es donde los constructores de más de la mitad de las clases se ven así
(....., LoggingProvider l, DbSessionProvider db, ExceptionFactory d, UserSession sess, Descriptions d)
Aquí hay una situación típica con la que tengo un problema: Tengo clases de excepción, que usan descripciones de error cargadas de la base de datos, usando una consulta que tiene un parámetro de configuración de idioma del usuario, que está en el objeto de sesión del usuario. Así que para crear una nueva excepción necesito una descripción, que requiere una sesión de base de datos y la sesión del usuario. Así que estoy condenado a arrastrar todos estos objetos a través de todos mis métodos en caso de que tenga que lanzar una excepción.
¿Cómo abordo este problema?