Jest to decyzja projektowa, która wydaje się często pojawiać: jak przekazać kontekst za pomocą metody, która jej nie potrzebuje, do metody, która to robi. Czy istnieje poprawna odpowiedź, czy zależy to od kontekstu.
Przykładowy kod, który wymaga rozwiązania
// 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);
}
Możliwe rozwiązania
- Threadlocal
- światowy
- obiekt kontekstowy
- przekazać zależność
- curry baz i przekaż go do paska z ustawioną zależnością jako pierwszy argument
- zastrzyk zależności
Przykłady gdzie pojawia się
Przetwarzanie żądań HTTP
Często używane są obiekty kontekstowe w postaci atrybutów żądania: patrz expressjs, Java Servlet lub owin .net.
Logowanie
Do logowania w Javie ludzie często używają globals / singletonów. Zobacz typowe wzorce logowania log4j / commons / java.
Transakcje
Lokalne wątki są często używane do utrzymywania transakcji lub sesji związanych z łańcuchem wywołań metod, aby uniknąć konieczności przekazywania ich jako parametrów do wszystkich metod, które ich nie potrzebują.