2008-10-07 71 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