このような状況で、私は「コンテキスト」という用語をうまく導入(再利用)し、時には複数のレイヤーを使用しました。
これは、これらの種類のオブジェクトをリクエストできるシングルトン、つまり「グローバル」オブジェクトストアを意味します。それらを必要とし、ストアのヘッダーを含め、グローバル関数を使用してオブジェクトインスタンスを取得するコード(現在のように、金利プロバイダー)。
ストアは次のいずれかです。
- 厳密に型指定:提供されるすべての型のヘッダーを含めるため、InterestRate getCurrentInterestRate();などの型指定されたアクセサーを作成できます。
- またはジェネリック:Object getObject(enum obType); そして、obType enumを新しい種類(obtypeCurrentInterestRate)でのみ拡張します。
システムが大きければ大きいほど、後者のソリューションはより使いやすくなり、間違った列挙型を使用するリスクは非常に小さくなります。一方、前方型宣言を許可する言語では、ストアにすべてのヘッダーを含めなくても型付きアクセサーを使用できると思います。
もう1つの注意:GUIや印刷出力、グローバルログやセッションレベルのログなどの言語値が異なる場合など、さまざまな用途で同じオブジェクトタイプの複数のインスタンスが存在する可能性があるため、列挙型/アクセサー名には実際のタイプを反映しないでください、ただしリクエストされたインスタンスの役割(CurrentInterestRate)。
ストアの実装では、コンテキストレベルとコンテキストインスタンスコレクションを管理する必要があります。簡単な例は、グローバルコンテキスト(そのオブジェクトに対するすべてのリクエストに対して1つのインスタンス-サーバーファームがある場合に問題がある)と各WebセッションのコンテキストがあるWebサービスです。また、複数の並列セッションなどを持つ可能性のある各ユーザーのコンテキストを持つこともできます。複数のサーバーでは、そのようなことのために一種の分散キャッシュを使用する必要があります。
リクエストが来たら、リクエストされたオブジェクトがどのコンテキストレベルであるかを決定し、呼び出しのためにそのコンテキストを取得します。オブジェクトが存在する場合は、それを送り返します。そうでない場合は、そのコンテキストレベルで作成して保存し、それを返します。もちろん、作成セクションを同期します(それを分散キャッシュに公開します)。作成はプラグインのように構成可能で、クラス名(Java、Objective Cなど)でオブジェクトインスタンスを作成できる言語が最適ですが、ファクトリ関数を備えたプラグ可能なライブラリを使用してCでも行うことができます。
補足:呼び出し元は、自身のコンテキスト、および要求されたオブジェクトのコンテキストレベルについてあまり知らないはずです。理由:1:これらのパラメーターを操作することで、間違い(または「巧妙なトリック」)を犯しやすくなります。2:要求されたコンテキストレベルは後で変更される可能性があります。私は主にコンテキスト情報をスレッドに接続しているので、オブジェクトストアにはリクエストからの追加のパラメーターなしで情報が含まれます。
一方、リクエストにはインスタンスのヒントが含まれる場合があります。たとえば、特定の日付の金利を取得する場合などです。これは同じ「グローバル」アクセスである必要がありますが、日付に応じて複数のインスタンスがあり(レート変更の間に同じインスタンスに異なる日付値を導く)、そのため、リクエストに「ヒント」オブジェクトを追加することをお勧めします。ストアではなくインスタンスファクトリ。ストアで使用される、ファクトリーへのkeyForHint。これらの関数は後で追加できます。
あなたの場合、これは一種のやり過ぎです(グローバルレベルで提供されるオブジェクトは1つだけです)が、今のところ非常に小さく単純な追加コードの場合、さらに複雑な要件のためのメカニズムが得られます。
もう1つの朗報です。Javaを使用している場合、あまり考えずにSpringからこのサービスを入手できます。詳しく説明したいと思います。