3

RMI と JMS の両方を使用して、Java バックエンドに接続されたリッチ クライアント (Flex で記述) に取り組んでいます。クライアントを DDD 方式で実装して、ドメイン オブジェクトに対する CRUD 操作用のリポジトリを作成することを考えていました。

ただし、問題は、すべてのバックエンド通信が非同期で発生し、クライアントが応答を受信するまで強制的に続行を待機させる方法がないことです。つまり、低レベルでは、リモート オブジェクトのメソッドを呼び出すことができ、戻り値として AsyncToken を取得できます。その後、asynctoken のイベントをリッスンして、呼び出しが成功したか失敗したかを確認できます。ただし、これはリポジトリの背後にある主なアイデアを壊し、技術的な詳細をクライアントから隠します。

私が推測する2つのオプションがあるかもしれません:

  1. リポジトリのメソッドが asynctoken を返すようにします。これは面倒な解決策のように思えます。
  2. メソッドが空のコレクション (たとえば、findAll の場合) を返すようにします。このコレクションは、応答を受信したときに満たされます。

どちらも一長一短ありますので、皆様のご意見をお聞かせいただければと思います。

(これをさらに進めると、適切なキャッシュ戦略は何でしょうか?状況によっては、リポジトリからすべてのエンティティを要求するたびにリポジトリがサーバーを呼び出すことは望ましくありません。リポジトリのメソッドの署名にどのように影響しますか? )

4

3 に答える 3

4

Flex および Flash Remoting は本質的に非同期であるため、そのパラダイムと戦うことは、多くの問題を引き起こします。私たちのサービス デリゲートは、すべてのメソッドから AsyncToken を返しますが、これで問題が発生したことはありません。

結果/障害が返されるまで、アプリケーションが新しいビューをレンダリングしたり、他のロジックを実行したりしないようにする場合は、次のようにします。

  1. 「ポスト結果/障害コード」を呼び出すカスタム イベントのイベント リスナーをアタッチします。
  2. 非同期呼び出しを行う
  3. 結果/障害の処理
  4. #1 からリスナーをトリガーするカスタム イベントをディスパッチします。

これにより、非同期呼び出しを行うたびに、多くの迷惑な定型コードが発生することに注意してください。同期実行パスが本当に必要かどうかを慎重に検討します。

于 2008-11-29T07:01:56.990 に答える
2

空のコレクションを返すのは間違っているので、AsyncToken を返すことをお勧めします。

キャッシュからデータを返す場合は、COMPLETE イベントがサブスクライブされる (そしてハンドラーが削除される) たびに、COMPLETE イベントをデータと共に自動的に起動する CompletedAsyncToken (: AsyncToken) を返します。

public class CompleteAsyncToken : AsyncToken
{
    public function CompleteAsyncToken(data : Object)
    {
        super(data);
    }

    public override addEventListener(type:String, listener:Function, useCapture:Boolean = false, priority:int = 0, useWeakReference:Boolean = false) : void
    {
        super.addEventListener(type, listener, useCapture, priority, useWeakReference);

        if (type == Event.COMPLETE)
        {
            // Don't just execute listener as EventDispatcher is not that simple
            super.dispatchCompleteEvent();
            super.removeEventListener(type, listener);
        }
    }
于 2008-10-21T13:49:02.330 に答える
1

戦略の 1 つは、リポジトリの前にファサードを作成することです。クライアントはファサードに対して非同期呼び出しを行い、それがリポジトリに対して同期呼び出しを行います。これにより、ファサードが呼び出しの非同期の側面を管理している間、リポジトリは同期的に動作し続けることができます。

于 2008-10-21T11:53:53.543 に答える