2008-10-07 70 views
3

我們正在致力於使用RMI和JMS連接到Java後端的富客戶端(用Flex編寫)。我正在考慮以DDD方式實現客戶端,以便它在域對象上具有CRUD操作的存儲庫。DDD和異步存儲庫

但問題是,所有的後端通信都發生異步,並且我沒有辦法強制客戶端等待它繼續收到響應。這意味着,在低層次上,我可以調用遠程對象的方法,並獲取AsyncToken作爲返回值。然後,我可以聽取asynctoken上的事件,查看通話是否已通過或失敗。然而,這破壞了存儲庫背後的主要想法,以隱藏來自客戶端的技術細節。

可能有2個選項我猜:

  1. 對資源庫中的方法返回的AsyncToken,這似乎是一個混亂的解決方案,我
  2. 有方法返回一個空的集合(一的findAll例如),當收到回覆時會被填滿。

兩者都有優點和缺點,我想從你們那裏得到一些意見。如果我們需要更好的緩存策略,那麼我不希望存儲庫每次向它請求所有實體時調用服務器,這會如何影響方法的簽名)。

回答

4

Flex和Flash Remoting本質上是異步的,所以與這種範式作鬥爭會給你帶來很大的麻煩。我們的服務代表從每種方法返回AsyncToken,我們從來沒有遇到過任何問題。

如果要確保應用程序不會呈現一個新的觀點或執行一些其他邏輯,直到結果/故障回來,你可以做到以下幾點:

  1. 附加一個事件監聽器自定義事件,這將調用你的「後結果/故障代碼」
  2. 使異步調用
  3. 處理結果/故障
  4. 調度自定義事件,從1號
01觸發你的聽衆

請記住,每次進行異步調用時都會導致大量煩人的boilterplate代碼。我會非常仔細地考慮你是否真的需要一個同步執行路徑。

1

一個領域是在存儲庫前面創建一個門面。您的客戶端將對門面進行異步調用,然後再對您的存儲庫進行同步調用。這將允許您的存儲庫繼續以同步方式工作,而Facade管理您的調用的異步方面。

2

我會建議返回一個AsyncToken作爲返回一個空集合只是感覺不對。

如果您要從緩存中返回數據,則返回一個CompletedAsyncToken(:AsyncToken),每當COMPLETE事件訂閱(然後移除處理程序)時,都會自動使用該數據觸發COMPLETE事件。

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); 
     } 
    } 
+1

剛剛發現這個,它對我很有用,所以我想我會加入它。我想你也想重載`addResponder(responder:IResponder)`,併爲任何已註冊的響應者調用`responder.result(一些空的結果對象)`。 – Ocelot20 2013-10-04 14:55:25