Essa é uma decisão de design que parece surgir bastante: como passar o contexto por um método que não precisa dele para um método que precisa. Existe uma resposta certa ou depende do contexto.
Código de exemplo que requer uma solução
// 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);
}
Soluções possíveis
- threadlocal
- global
- objeto de contexto
- passar a dependência através
- curry baz e passá-lo para a barra com a dependência definida como o primeiro argumento
- Injeção de dependência
Exemplos de onde vem
Processamento de solicitação HTTP
Objetos de contexto na forma de atributos de solicitação são frequentemente usados: consulte expressjs, Java Servlets ou o owin do .net.
Exploração madeireira
Para o registro em Java, as pessoas geralmente usam globals / singletons. Consulte os padrões log4j / commons logging / java logging típicos.
Transações
Os locais de encadeamento costumam ser usados para manter uma transação ou sessão associada a uma cadeia de chamadas de método, para evitar a necessidade de passá-las como parâmetros para todos os métodos que não precisam.