まず、ファイル システムに関して言えば、Windows Server OS では、ディスクの上にビルトイン キャッシュ レイヤーがあります。したがって、ディスクの読み取りに関しては、おそらく大きな違いは感じないでしょう。もちろん、同じ入力を何度も解析するのは良い方法ではないため、解析 (トークン化) された xml をキャッシュする必要があります。
設計にはさらに説明が必要です。
5 つのサービス間で共有される DAL クラスのインスタンスは 1 つだけですか? それとも、アイデア 1 で説明したプロパティは静的でしょうか?
アイデア 2: ファイルが変更され、たとえば、接続文字列 4 が変更された場合 (他のすべては同じまま)、サービス 4 のみをリロードする必要がありますか?
特定のサービスがリロードされた場合、他の (最新ではない) サービスと何らかの矛盾が生じますか?
アップデート:
シナリオを完全に理解しているかどうかはまだわかりませんが、理解できる限り、次のことを行います。
DAL は、すべてのデータ関連操作のインターフェイスを公開する必要があります。
だとしましょうIDataGateway
これで、各サービスには、 を実装するインスタンスへの参照が必要になりますIDataGateway
。サービスは、キャッシュ メカニズムをまったく認識しないようにする必要があります。インターフェイスからのデータを消費するだけです。
したがって、すべてのキャッシングは、クラスとコード編成に関して、サービスの外部で行われます。
今度は、キャッシング層が を実装しIDataGateway
、キャッシュされていない のインスタンスも消費しますIDataGateway
。それはデコレーターパターンと呼ばれます。キャッシュされていないインスタンスは、コンストラクターに挿入されます。
ここで、各サービスに cached の独自のインスタンスを用意することをお勧めしますIDataGateway
。シングルトンよりも簡単です(少なくとも私にとっては)。また、データはサービス間で共有されないため、問題ありません。ただし、データがサービス間で共有される場合は、単一のインスタンスを使用する必要があります。
これらの 5 つのインスタンスと xml ファイルに戻ります。
このファイルが変更されたら監視したいですよね?独自のファイル モニターを簡単に作成したり、フレームワークに付属のファイル モニターを使用したり、CacheDependency クラスのソース コードを確認したりできます。
最も簡単な方法は、5 台のモニターで同じファイルを監視することです。タイマーは非常に「安価」であるため、パフォーマンスが大幅に低下することはありません。
ただし、システムで使用されるリソースを削減したい場合は、単一のモニターを使用して、そのイベントFileChanged
またはそのようなものを発生させることができます。の 5 つのキャッシュされた実装 (これらの 5 つのインスタンス) のそれぞれは、IDataGateway
このモニターをそのコンストラクターに挿入し、独自のイベント リスナーをイベントに接続する必要がありFileChanged
ます。
このイベントがトリガーされると、キャッシュされた の 5 つのインスタンスすべてがIDataGateway
内部キャッシュを無効にするため、メモリ内のエントリをクリアする必要があります。
次の呼び出しで、 のキャッシュされた実装はIDataGateway
メモリ内キャッシュから存在しないデータを取得しようとしますが、明らかにそこには何もないため、 のキャッシュされていない実装で同じメソッドを実行し続けIDataGateway
、データを取り込みます。そのキャッシュ。
それが私のデザインです、HTH...