Это дизайнерское решение, которое, кажется, приходит довольно много: как передать контекст через метод, который ему не нужен, в метод, который это делает. Есть ли правильный ответ или это зависит от контекста.
Пример кода, который требует решения
// 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);
}
Возможные решения
- ThreadLocal
- Глобальный
- контекстный объект
- передать зависимость через
- карри баз и передать его в бар с зависимостью, установленной в качестве первого аргумента
- внедрение зависимости
Примеры того, где это подходит
Обработка HTTP-запроса
Часто используются объекты контекста в форме атрибутов запроса: см. Expressjs, Java Servlets или .net.
логирование
Для регистрации Java люди часто используют глобалы / синглтоны. Посмотрите типичные шаблоны log4j / commons logging / java logging.
операции
Локальные потоки часто используются для хранения транзакции или сеанса, связанных с цепочкой вызовов методов, чтобы избежать необходимости передавать их в качестве параметров всем методам, которые в них не нуждаются.