Questa è una decisione progettuale che sembra emergere molto: come passare il contesto attraverso un metodo che non ne ha bisogno a 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 contestuale
- passare la dipendenza
- curry baz e passalo al bar con la dipendenza impostata come primo arg
- iniezione di dipendenza
Esempi di dove viene
Elaborazione richiesta HTTP
Vengono spesso utilizzati oggetti di contesto sotto forma di attributi di richiesta: consultare expressjs, servlet Java o .net's owin.
Registrazione
Per la registrazione di Java, le persone usano spesso globi / singleton. Vedi i tipici schemi di log4j / commons logging / java logging.
Le transazioni
I locali dei thread vengono spesso utilizzati per mantenere una transazione o una sessione associata a una catena di chiamate al metodo per evitare di doverle passare come parametri a tutti i metodi che non ne hanno bisogno.