2012-01-15 10 views
4

私はSOAP WCFサービスエンドポイントを公開するサーバーを持っています。また、このサーバは、同じクラスタ内の他のサーバと通信するためにEnsembleと呼ばれるグループ通信フレームワーク(質問と実際には関係ありません)を使用します。C#とWCFのスレッド間でオブジェクトを共有する

私が入ってくる他のサーバーからのメッセージとそれらが呼び出されたときにWCFルーチンを実行するスレッドをリッスン別々のスレッド間でのオブジェクト/データを共有する必要があります。これまでは、私が考えることができる最も簡単なことをしました。静的メンバーと静的メソッドを持つ静的な "データベース"クラスを作成し、lock()を使用して同期しました。この方法で、私はこのクラスをサーバーとグループ通信スレッドの両方からアクセスできます。私の問題はこれがちょっとOOPのことを壊してしまい、ここでもっと巧妙なことができると思います...

+0

OOP-nessを目指すことは決して目標ではありません。 – diggingforfire

+0

「OOP事」はどのように壊れていますか? OOPはスレッドとスレッド間のオブジェクトの共有については何も言いません。 –

答えて

3

あなたのソリューションで唯一問題となっているのは、あなたはSingleton Patternの代わりに行くことができます。これは、システムの複数の部分で共有される必要がある、クラスのインスタンスを1つしか持たなくてはならない状況で広く使用されています。パターンは多少議論の余地があります。なぜならそれはグローバル変数の栄光に満ちたバージョンだと考えていますが、仕事を効率的に行うためです。

0

他のサーバーからの着信メッセージを受信する別のスレッドをクラスにカプセル化して、MyCustomServiceと言う。

concurrencyModeの倍数として行動してWCFサービス実装クラスを作成し、InstanceContextModeシングル

は、WCFサービス実装クラス内のイベントdelagateを書きます。デリゲートは、MyCustomServiceクラスの型を返します。

WCFサービスをプログラムでインスタンス化すると(host.Open)、その前にシングルトンまたは静的なMyCustomServiceインスタンスを返す関数にデリゲートを設定します。

サービスインスタンスクラスから、いつでも代理人を呼び出してMyCustomServiceインスタンスを取得できます。しかし、nullをチェックしてください。

関連する問題