Hierbei handelt es sich um eine Entwurfsentscheidung, die anscheinend ziemlich häufig zu treffen ist: Wie kann der Kontext durch eine Methode geleitet werden, die ihn nicht benötigt? Gibt es eine richtige Antwort oder kommt es auf den Kontext an?
Beispielcode, der eine Lösung erfordert
// 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);
}
Mögliche Lösungen
- threadlocal
- global
- Kontextobjekt
- die Abhängigkeit weitergeben
- curry baz und gib es in bar mit der abhängigkeit als erstes arg
- Abhängigkeitsspritze
Beispiele dafür, wo es herkommt
HTTP-Anforderungsverarbeitung
Kontextobjekte in Form von Anforderungsattributen werden häufig verwendet: siehe expressjs, Java Servlets oder .net's owin.
Protokollierung
Für die Java-Protokollierung werden häufig Globals / Singletons verwendet. Siehe die typischen Log4J- / Commons-Logging- / Java-Logging-Muster.
Transaktionen
Thread-Locals werden häufig verwendet, um eine Transaktion oder Sitzung mit einer Kette von Methodenaufrufen zu verknüpfen, damit sie nicht als Parameter an alle Methoden übergeben werden müssen, die sie nicht benötigen.