Durante la progettazione di un sistema mi trovo spesso ad affrontare il problema di avere un mucchio di moduli (logging, accesso ai database, ecc.) utilizzati dagli altri moduli. La domanda è, come faccio a fornire questi componenti ad altri componenti. Due risposte sembrano possibili iniezioni di dipendenza o utilizzando il modello di fabbrica. Comunque entrambi sembrano sbagliati:
- Le fabbriche fanno provare un dolore e non consentono un facile scambio di implementazioni. Inoltre, non rendono le dipendenze apparenti (ad esempio, stai esaminando un metodo, ignaro del fatto che chiama un metodo che chiama un metodo che chiama un metodo che utilizza un database).
- L'iniezione di dipendenze fa gonfiare in modo massiccio gli elenchi degli argomenti del costruttore e mostra alcuni aspetti in tutto il codice. La situazione tipica è dove i costruttori di più della metà delle classi sembrano questo
(....., LoggingProvider l, DbSessionProvider db, ExceptionFactory d, UserSession sess, Descriptions d)
Ecco una situazione tipica con cui ho un problema: Ho delle classi di eccezioni, che usano le descrizioni degli errori caricate dal database, usando una query che ha un parametro di impostazione della lingua dell'utente, che è nell'oggetto della sessione utente. Quindi per creare una nuova eccezione ho bisogno di una descrizione, che richiede una sessione di database e la sessione dell'utente. Quindi sono condannato a trascinare tutti questi oggetti su tutti i miei metodi solo nel caso in cui possa essere necessario lanciare un'eccezione.
Come posso affrontare questo problema ??