Al diseñar un sistema, a menudo me enfrento al problema de que los otros módulos utilicen un montón de módulos (registro, acceso a la base de datos, etc.). La pregunta es, ¿cómo hago para proporcionar estos componentes a otros componentes? Dos respuestas parecen posibles inyección de dependencia o utilizando el patrón de fábrica. Sin embargo, ambos parecen equivocados:
- Las fábricas dificultan las pruebas y no permiten el intercambio fácil de implementaciones. Tampoco hacen aparentes las dependencias (por ejemplo, está examinando un método, ajeno al 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 dependencia aumenta enormemente las listas de argumentos del constructor y difumina algunos aspectos en todo el código. La situación típica es donde los constructores de más de medias 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 de usuario, que está en el objeto de sesión de usuario. Entonces, para crear una nueva excepción, necesito una descripción, que requiere una sesión de base de datos y la sesión de usuario. Así que estoy condenado a arrastrar todos estos objetos a través de todos mis métodos en caso de que necesite lanzar una excepción.
¿Cómo abordo tal problema?