3

WCFベースのシステムを開発しています。その過程で、複数のユーザーによる変更から一部のデータをロックしようとしています。そこで、ロックロジックを実行するために必要な情報を含むデータ構造を作成することにしました(たとえば、ロックされたオブジェクトのIDを保存するなど)。

私たちが抱えている問題は、セッション間でそのデータを永続化することです。とにかく、高価なデータベース呼び出しの実行を回避できますか?WCFは開いているセッション中にのみ(メモリ内の)データを永続化できるため、WCFでこれをどのように行うことができるかわかりません。

4

4 に答える 4

4

クラスを実装するサービスの静的メンバーは、セッションと呼び出しの間で共有されます。

于 2009-01-09T23:21:22.897 に答える
3

Jimmy McNulty が言ったように、1 つのオプションは静的メンバーを使用することです。ユーザー指定の IP アドレスに基づいてネットワーク接続を開く WCF サービスがあります。私のサービスは、PerCall サービス インスタンス モード用に構成されています。各セッションで、静的データ構造をチェックして、指定された IP アドレスに対してネットワーク接続が既に開かれているかどうかを確認します。これが例です。

[ServiceContract]
public interface IMyService
{
    [OperationContract]
    void Start(IPAddress address);
}

[ServiceBehavior(InstanceContextMode=InstanceContextMode.PerCall)]
public class MyService : IMyService
{
    private static readonly List<IPAddress> _addresses = new List<IPAddress>();
    public void Start(IPAddress address)
    {
        lock(((ICollection)_addresses).SyncRoot)
        {
            if (!_addresses.Contains(address)
            {
                // Open the connection here and then store the address.
                _addresses.Add(address);
            }
        }
    }
}

構成されているように、Start() への各呼び出しは独自のサービス インスタンス内で発生し、各インスタンスは静的コレクションにアクセスできます。各サービス インスタンスは個別のスレッド内で動作するため、コレクションへのアクセスを同期する必要があります。

マルチスレッド プログラミングで行われるすべての同期と同様に、ロックに費やされる時間を最小限に抑えるようにしてください。示されている例では、最初の呼び出し元がロックを取得すると、他のすべての呼び出し元はロックが解放されるまで待機する必要があります。これは私の状況では機能しますが、あなたの状況では機能しない場合があります。

もう 1 つのオプションは、PerCall サービス インスタンス モードではなく、Single サービス インスタンス モードを使用することです。

[ServiceBehavior(InstanceContextMode=InstanceContextMode.Single)]
public class MyService : IMyService
{ ... }

しかし、私が読んだすべてのことから、PerCall はより柔軟に見えます。

2 つの違いについては、このリンクをたどることができます。

また、サービスを実装するクラスはまさにクラスであることを忘れないでください。すべての C# クラスと同じように機能します。静的コンストラクター、プロパティ、イベント ハンドラーを追加したり、追加のインターフェイスを実装したりできます。

于 2009-01-10T04:48:49.037 に答える
0

おそらく、 velocityのようなキャッシングフレームワークが役に立ちます。

于 2008-11-09T14:10:56.837 に答える
0

2 番目のクラスを作成し、その InstanceContextMode を single に設定し、すべての高価なメソッドをそこに移動してから、元のクラスでそのメソッドを使用します。

于 2008-11-09T15:26:26.453 に答える