1

WCF私は、それぞれがSQLに対して他の作業を行うさまざまなサービスを構築するように求められました.

5 dbあります。すべてのデータベースと接続文字列は1 つのxml ファイルにあります。(ファイルシステムファイル)

WASサービスはiis 7.5でホストされています。

各サービスは db から読み取る必要があるため、各サービスはDAL dllファイルを参照します。

コンポーネントは次のとおりです。

ここに画像の説明を入力

CACHExml データを(最初のリクエストで) 読み取り、今後はキャッシュから読み取りたいと思います。(リクエストごとにファイルを読み取ることは問題外です)。

  • アイデア #1 = 彼の ctor 内の dll は、最初のリクエストで xml ファイルを読み取り、そのキャッシュにロードします。

は次のようにdalなります。

ここに画像の説明を入力

そのため、各サービスはプロパティを介して DLL のキャッシュ オブジェクトにアクセスできます。( 1 つの利点はcache dependency、単一のファイルを処理する場合です。そのため、ファイルが変更されている場合は、1 つの場所にのみリロードする必要があります)。

  • アイデア #2 = サービスが起動したら、xml をその cache.xml にロードします。

したがって、各サービスは次のようになります。

サービス #1 :

ここに画像の説明を入力

サービス #2 :

ここに画像の説明を入力

..

欠点は、同じファイルに多くのキャッシュ依存関係があることです

Question :

ベスト プラクティスの経験と設計パターンによるPOV : どちらが好ましい方法ですか?

ps xml ファイルの変更頻度 1/(1 か月)

4

2 に答える 2

2

まず、ファイル システムに関して言えば、Windows Server OS では、ディスクの上にビルトイン キャッシュ レイヤーがあります。したがって、ディスクの読み取りに関しては、おそらく大きな違いは感じないでしょう。もちろん、同じ入力を何度も解析するのは良い方法ではないため、解析 (トークン化) された xml をキャッシュする必要があります。

設計にはさらに説明が必要です。

  1. 5 つのサービス間で共有される DAL クラスのインスタンスは 1 つだけですか? それとも、アイデア 1 で説明したプロパティは静的でしょうか?

  2. アイデア 2: ファイルが変更され、たとえば、接続文字列 4 が変更された場合 (他のすべては同じまま)、サービス 4 のみをリロードする必要がありますか?

  3. 特定のサービスがリロードされた場合、他の (最新ではない) サービスと何らかの矛盾が生じますか?

アップデート:

シナリオを完全に理解しているかどうかはまだわかりませんが、理解できる限り、次のことを行います。

DAL は、すべてのデータ関連操作のインターフェイスを公開する必要があります。

だとしましょうIDataGateway

これで、各サービスには、 を実装するインスタンスへの参照が必要になりますIDataGateway。サービスは、キャッシュ メカニズムをまったく認識しないようにする必要があります。インターフェイスからのデータを消費するだけです。

したがって、すべてのキャッシングは、クラスとコード編成に関して、サービスの外部で行われます。

今度は、キャッシング層が を実装しIDataGateway、キャッシュされていない のインスタンスも消費しますIDataGateway。それはデコレーターパターンと呼ばれます。キャッシュされていないインスタンスは、コンストラクターに挿入されます。

ここで、各サービスに cached の独自のインスタンスを用意することをお勧めしますIDataGateway。シングルトンよりも簡単です(少なくとも私にとっては)。また、データはサービス間で共有されないため、問題ありません。ただし、データサービス間で共有される場合は、単一のインスタンスを使用する必要があります。

これらの 5 つのインスタンスと xml ファイルに戻ります。

このファイルが変更されたら監視したいですよね?独自のファイル モニターを簡単に作成したり、フレームワークに付属のファイル モニターを使用したり、CacheDependency クラスのソース コードを確認したりできます。

最も簡単な方法は、5 台のモニターで同じファイルを監視することです。タイマーは非常に「安価」であるため、パフォーマンスが大幅に低下することはありません。

ただし、システムで使用されるリソースを削減したい場合は、単一のモニターを使用して、そのイベントFileChangedまたはそのようなものを発生させることができます。の 5 つのキャッシュされた実装 (これらの 5 つのインスタンス) のそれぞれは、IDataGatewayこのモニターをそのコンストラクターに挿入し、独自のイベント リスナーをイベントに接続する必要がありFileChangedます。
このイベントがトリガーされると、キャッシュされた の 5 つのインスタンスすべてがIDataGateway内部キャッシュを無効にするため、メモリ内のエントリをクリアする必要があります。

次の呼び出しで、 のキャッシュされた実装はIDataGatewayメモリ内キャッシュから存在しないデータを取得しようとしますが、明らかにそこには何もないため、 のキャッシュされていない実装で同じメソッドを実行し続けIDataGateway、データを取り込みます。そのキャッシュ。

それが私のデザインです、HTH...

于 2012-11-04T21:23:40.647 に答える
0

私にとっての質問は、接続文字列について本当に知る必要があるのは誰ですか?DALまたはサービスですか?明らかにそれはDALです。このサービスは、DALが使用しているデータストアの種類を気にしません(または気にしないでください)。気にするすべての場合、ディスク上のCSVの束である可能性があります(そうです!)。したがって、接続文字列をサービスに配置することは意味がありません。DALは接続情報を必要とするため、DALは接続情報の検索とキャッシュを処理する必要があります。

于 2012-11-05T01:32:53.767 に答える