2016-09-26 4 views
0

私は、読み取り専用の情報リポジトリにアクセスする必要のあるWCFサービスを持っています。このリポジトリは作成するのに費用がかかります。つまり、一度作成してサービスクラス/サービスクラス間で共有する必要があります。クラススレッドを一般に安全にすることは、リポジトリスレッドを安全にするだけでなく、問題でもありません。 「複数の」を「シングル」と「ConcurrencyMode」にWCFの共有読み取り専用データ - InstanceContextModeの選択

  1. 単に設定「InstanceContextMode」、手動で単一のサービスオブジェクトを作成し、単一のリポジトリがそれに注入持っている:私は、リポジトリーを共有するための2つのオプションを検討していますコンストラクタを介して

  2. "PerCall"(または "PerSession")に設定された "InstanceContextMode"を使用して、自分のサービス用のカスタムサービスインスタンスプロバイダを実装します。このインスタンス・プロバイダは、作成プロセスの一部として、リポジトリの単一インスタンスをすべてのサービス・クラス・インスタンス(コンストラクタ)に挿入できます。

ここで私の状況でオプション1を使用しない理由は何ですか(十分な情報を提出した場合)?私にとっては一番簡単なのですか?私は "InstanceContextMode"が "Single"に設定されていることがパフォーマンス/スケーラビリティに悪いことを読んでいますが、これは常にケースかどうか、またはサービスのプロパティに依存しているかどうかを確認することはできません。

すでに言及したように、私はあなたが答えられるようにするために私の特定のケースに関する十分な情報を提供していない可能性があることを認識しています。

敬具、 ヨハン

答えて

0

情報の読み取り専用のリポジトリにアクセスする必要がWCFサービス。このリポジトリは作成に費用がかかります。つまり、一度作成してサービスクラス/サービスインスタンス間で共有する必要があります。

上記のシナリオは、キャッシュメカニズムを使用する必要がなくなります"InstanceContextMode"を使用する必要がある状況です。

したがって、MemoryCacheを使用してこれを達成できるはずです。読み取り専用オブジェクトをメモリキャッシュにロードして、同時に実行できるWebサービス呼び出し間で共有することができます。

+0

回答ありがとうございます!これは、良い選択肢のように、ソリューション#2(複数のインスタンス)と同じテーマのように思えます。しかし、もし#1が悪い解決策であるならば、私はまだ興味を持っています。私には、その部分を理解することが重要です。 –

+0

私の意見では#1はあなたのサービスをシングルスレッド化するので悪いです。複数のシステムやデバイスからアクセスできるAPIでこのパターンを使用すると、Apiは事実上使用できなくなります。 MSDNによると、_Single:各インスタンスコンテキストは、一度にインスタンスコンテキストでメッセージを処理するスレッドを最大1つ持つことができます。同じインスタンスコンテキストを使用したい他のスレッドは、元のスレッドがインスタンスコンテキストを終了するまでブロックする必要があります。 –

+0

その設定の "ConcurrencyMode"とオプション "Single"の記述ではありませんか? #1では、 "ConcurrencyMode"を "Multiple"に設定し、 "InstanceContextMode"を "Single"に設定します。私にとっては、単一のオブジェクトがすべてのサービス呼び出しに使用され、単一のオブジェクトが複数の呼び出しで同時に使用されることを意味します。これはもちろん、スレッド同期を必要とします。 –

関連する問題