これは、非常に多くのように思われる設計上の決定です。コンテキストを必要としないメソッドにコンテキストを渡す方法にコンテキストを渡す方法。正しい答えがありますか、それともコンテキストに依存しますか。
ソリューションを必要とするサンプルコード
// 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);
}
可能な解決策
- スレッドローカル
- グローバル
- コンテキストオブジェクト
- 依存関係を通過させる
- bazをカレーし、依存関係を最初の引数としてbarに渡します
- 依存性注入
どこにあるのかの例
HTTPリクエスト処理
要求属性の形式のコンテキストオブジェクトがよく使用されます。expressjs、Javaサーブレット、または.netのowinを参照してください。
ロギング
Javaロギングでは、多くの場合、グローバル/シングルトンを使用します。典型的なlog4j / commons logging / javaのロギングパターンを参照してください。
取引
スレッドローカルは、メソッド呼び出しのチェーンに関連付けられたトランザクションまたはセッションを保持するためによく使用され、それらを必要としないすべてのメソッドにパラメーターとして渡す必要がなくなります。