1

私はFlex プロジェクトでコマンド パターンを利用してきましたが、以下の間に非同期コールバック ルートが必要です。

  • 与えられたコマンドオブジェクトとコマンドオブジェクトをインスタンス化した人は誰でも、
  • コマンド オブジェクトと、コマンド オブジェクトが呼び出す「データ アクセス」オブジェクト (つまり、ネットワークを介してサーバーへのリモート プロシージャ コールを処理する人)。

これら 2 つのコールバック ルートのそれぞれが、1 対 1 の関係になる必要があります。これは、特定のコマンド クラスの複数のインスタンスがまったく同じジョブを同時に実行しているが、パラメーターがわずかに異なる可能性があるためであり、それらのコールバックが混同されることは望ましくありません。AS3 で非同期性を処理するデフォルトの方法であるイベントの使用は、本質的に 1 対多の関係に基づいているため、ほとんど役に立ちません。

現在、特定の種類のシグネチャを持つコールバック関数参照を使用してこれを行っていますが、誰かがより良い (または代替の) 方法を知っているかどうか疑問に思っていましたか?

私の現在の方法を説明する例を次に示します。

  • ユーザー アクションによってインスタンスを生成するビュー オブジェクトがありDeleteObjectCommand、それ自体のプライベート メンバー関数の 2 つ (成功の場合は 1 つ、失敗の場合は 1 つ: この例では"deleteObjectSuccessHandler()""deleteObjectFailureHandler()") への参照をコマンド クラスのコールバック関数への参照として渡します。コンストラクタ。
  • 次に、コマンド オブジェクトは、「データ アクセス」オブジェクトへの接続でこのパターンを繰り返します。
  • ネットワーク上の RPC が正常に完了した (または失敗した) 場合、適切なコールバック関数が最初に「データ アクセス」オブジェクトによって呼び出され、次にコマンド オブジェクトによって呼び出されます。場所は、deleteObjectSuccessHandler()または呼び出されることによって通知されdeleteObjectFailureHandler()ます。
4

3 に答える 3

3

もう 1 つのアイデアを試してみます。

RPC 呼び出しからの AsyncToken の代わりに、データ アクセス オブジェクトが独自の AsyncToken (または保留中の呼び出しをカプセル化する他のオブジェクト) を返すようにします。したがって、DAO では次のようになります (これは非常に大ざっぱなコードです)。

public function deleteThing( id : String ) : DeferredResponse {
    var deferredResponse : DeferredResponse = new DeferredResponse();

    var asyncToken : AsyncToken = theRemoteObject.deleteThing(id);

    var result : Function = function( o : Object ) : void {
        deferredResponse.notifyResultListeners(o);
    }

    var fault : Function = function( o : Object ) : void {
        deferredResponse.notifyFaultListeners(o);
    }

    asyncToken.addResponder(new ClosureResponder(result, fault));

    return localAsyncToken;
}

もちろん、DeferredResponseandClosureResponderクラスは存在しません。AsyncToken独自のものを発明する代わりに の代わりに使用できますDeferredResponseが、公開バージョンの にAsyncTokenはレスポンダーをトリガーする方法がないように思われるため、とにかくそれをサブクラス化する必要があります。成功または失敗時に関数を呼び出すことができるClosureResponder実装です。IResponder

とにかく、上記のコードがビジネスを行う方法は、RPC サービスを呼び出し、保留中の呼び出しをカプセル化するオブジェクトを作成し、そのオブジェクトを返し、RPC が戻ったときにクロージャーの 1 つresultまたはfault呼び出されることです。 RPC 呼び出しが行われたときのスコープへの参照は、保留中の呼び出し/遅延応答でメソッドをトリガーできます。

コマンドでは、次のようになります。

public function execute( ) : void {
    var deferredResponse : DeferredResponse = dao.deleteThing("3");

    deferredResponse.addEventListener(ResultEvent.RESULT, onResult);
    deferredResponse.addEventListener(FaultEvent.FAULT,   onFault);
}

executeまたは、コマンドが DAO から取得する遅延応答がトリガーされたときにトリガーされる独自の遅延応答をメソッドに返すようにして、パターンを繰り返すこともできます。

しかし。これは特に美しいとは思いません。この種の問題を多かれ少なかれ正確に解決するために存在する多くのアプリケーション フレームワークの 1 つを使用することで、おそらくより適切で、複雑さを軽減し、もつれの少ないことを行うことができます。私の提案はMateです。

于 2008-09-10T12:06:00.653 に答える
1

RemoteObject、 などのFlex RPC クラスの多くは、呼び出すと s をHTTPService返しAsyncTokenます。これがあなたが求めているもののようです。基本的に、AsyncTokenは保留中の呼び出しをカプセル化し、コールバックを (IResponderインスタンスの形式で) 特定の呼び出しに登録できるようにします。

の場合、HTTPServiceコールsend()するAsyncTokenと が返され、このオブジェクトを使用して特定のコールを追跡できますResultEvent.RESULT。送信済)。

于 2008-09-10T10:18:13.923 に答える
0

AbstractCollection は、Flex / AIR で永続オブジェクトを処理する最良の方法です。GenericDAO が答えを提供します。

DAO は、CRUD 操作や、ValueObject (Java では Pojo と呼ばれる) に対して実行されるその他の一般的な操作を管理するオブジェクトです。GenericDAO は、汎用的に使用できる再利用可能な DAO クラスです。ゴール:

JAVA IBM GenericDAO で新しい DAO を追加するには、値オブジェクト (pojo) を追加するだけです。valueobject の hbm.xml マッピング ファイルを追加します。DAO 用の 10 行の Spring 構成ファイルを追加します。

同様に、AS3 Project Swiz DAO で。私たちは、同様の成果を達成したいと考えています。

クライアント側の GenericDAO モデル: クライアント側の言語で作業していたので、永続オブジェクト Collection (すべての valueObject に対して) も管理する必要があります。使用法: ソース: http://github.com/nsdevaraj/SwizDAO

于 2010-05-13T05:25:35.550 に答える