Questa è una decisione progettuale che sembra emergere parecchio: come passare il contesto attraverso un metodo che non ne ha bisogno per un metodo che lo fa. C'è una risposta giusta o dipende dal contesto.
Codice di esempio che richiede una soluzione
// needs the dependency
function baz(session) {
session('baz');
}
// doesn't care about the dependency
function bar() {
baz();
}
// needs the dependency
function foo(session) {
session('foo')
bar();
}
// creates the dependency
function start() {
let session = new Session();
foo(session);
}
Possibili soluzioni
- ThreadLocal
- globale
- oggetto contesto
- passa la dipendenza attraverso
- curry baz e passalo in bar con il set di dipendenze come primo argomento
- iniezione di dipendenza
Esempi di dove si trova
Elaborazione richiesta HTTP
Gli oggetti di contesto sotto forma di attributi di richiesta sono spesso usati: vedere expressjs, Java Servlet o .net owin.
Accesso
Per le persone che registrano Java spesso usano globals / singleton. Vedi i tipici log di registrazione / java log4j / commons.
Rapporti
I locals di thread sono spesso usati per mantenere una transazione o una sessione associata a una catena di chiamate di metodo per evitare di doverli passare come parametri a tutti i metodi che non ne hanno bisogno.