0

WCF Web サービスに接続された Silverlight アプリを作成する場合、Web サービスを使用する際に提示される唯一のオプションは、WS インターフェイスへの非同期呼び出しを行うことです。

すなわち

WebService client = new WebService();
client.ServiceMethodCompleted += new EventHandler<Args>(client_Handler);
client.ServiceMethodAsync();
client.close()

...followed by
void client_Handler(object sender, Args e)
{
    //Next step, possibly another method?
}

Web アプリケーション (セーフティ ネット) を作成するときに非同期呼び出しを行う理由は理解できますが、各ステップが Web サービス呼び出しの結果に依存するメソッドを作成する場合、どのような設計パターンを使用するのでしょうか?

たとえば、訪問者のユーザー資格情報をチェックするメソッドが Web サービスにある場合、そのユーザーのグループに応じて何らかのアクションを実行します。

public MyPage() //Constructor
{
    CheckCredentialsAsync();

    if(result.IsUserTypeA)
    {
       //something complex
    }
    else if(result.IsUserTypeB)
    {
       //something else complex
    }
    ...etc

}

以前の非同期呼び出し完了イベントによってトリガーされるメソッドの「ドミノ」設計を使用せずにこれを達成する方法はありますか? クライアント/サービスのやり取りが多いと、面倒になる可能性があるようです。

ありがとう!

4

3 に答える 3

4

このようなパターンについて私が知っている最良のモデリングは、イベント駆動型の有限ステート マシンです。非同期メソッドの完了はイベントであり、「複雑な操作」はアクションであり、MyPage インスタンスは現在の状態です。ただし、FSM はかなりの数の状態やイベントに対して非常に複雑になる可能性があり、より単純な FSM を構成することで何らかの形で抑制できますが、このパターンを直感的で簡単とは言えません。

率直に言って、私はあなたが説明した一連のコールバックを好むことがよくあります。「ドミノ」効果は必ずしも悪いものではありません。このようなモジュールをいくつか作成すると、コツがつかめます。その複雑さは、基本的に「何か複雑な」ブロックで可能な実行分岐の数によって決まります。同期パスでは if 分岐があり、非同期パスでは 2 つの別個のコールバックが存在する可能性があります。入力するコードが増えますが、理解するのが必ずしも難しくありません。そして、「より多くのコード」の部分は、coe をヘルパーに適切にファクトリー化することで処理できます。

私は Silverlight クラスを扱っていないと思いますが、私の経験は主に WebRequest、SqlClient、および Stream 操作の非同期動作に関するものです。最後に、最も複雑な部分は、エラー処理の分割とリソース所有権の分割であることがわかりました。これは、usingパターンが非同期ではあまり役に立たないためです。

于 2009-10-27T00:20:05.720 に答える
2

コールバックを連鎖させたくない場合は、Jeffrey Richter の AsyncEnumerator をチェックしてください: http://www.wintellect.com/PowerThreading.aspx

Silverlight にも対応しています。

于 2009-10-31T07:55:30.727 に答える
0

私はあなたに同意します:
呼び出しの長いドミノ チェーンを見るのは醜いです。ページ内のコールとコールバックの(無限の)リストは、特定のシリーズが単一のセットの一部であることを他の開発者に必ずしも伝達しないため、コードが混乱します。これが、デザイン パターンを使用してこれらの呼び出しを 1 つのオブジェクトにラップする理由です。

呼び出しのドミノ チェーンの場合...

以前の呼び出しデータを使用する: DECORATOR設計パターン
を使用して、これらの呼び出しをオブジェクトにラップします。デコレーター パターンを使用するものの良い例は、STREAMオブジェクトです。

呼び出しのドミノ チェーンの場合...

以前の呼び出しデータを使用しない: CHAIN OF RESPONSIBILITYデザイン パターン
を使用して、これらの呼び出しをオブジェクトにラップします。

ただし
、どちらか一方を使用する、または使用しない理由はたくさんあります。私はあなたの特定の状況に対応しようとしているだけです。 どちらを使用するかを決定する方法は次のとおりです。

于 2011-02-10T13:35:15.403 に答える