我们正在使用RMI和JMS连接到Java后端的富客户端(用Flex编写)。我正在考虑以DDD方式实现客户端,以便它具有域对象上CRUD操作的存储库。
然而问题是所有后端通信都是异步的,我无法强迫客户端等待继续直到收到响应。这意味着,在较低级别,我可以在远程对象上调用方法,并获得AsyncToken作为返回值。然后我可以听到asynctoken上的事件,看看是否已经通过或者失败了。然而,这打破了存储库背后的主要思想,以隐藏客户端的技术细节。
我猜可能有两个选项:
两者都有利弊,我想得到你们的一些意见。
(更进一步,什么是好的缓存策略?依赖于这种情况,我不希望每次我请求所有实体时,存储库都会调用服务器。这将如何影响方法的签名存储库。)
答案 0 :(得分:4)
Flex和Flash Remoting本质上是异步的,因此与这种模式作斗争会给你带来很多麻烦。我们的服务代表从每个方法返回AsyncToken,我们从来没有遇到任何问题。
如果要确保应用程序在结果/错误恢复之前不呈现新视图或执行其他逻辑,则可以执行以下操作:
请记住,每次进行异步调用时,这都会导致很多恼人的boilterplate代码。我会非常仔细地考虑你是否真的需要一个同步执行路径。
答案 1 :(得分: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);
}
}
答案 2 :(得分:1)
一个困难是在存储库前面创建一个外观。您的客户端将对外观进行异步调用,从而对您的存储库进行同步调用。这将允许您的存储库继续以同步方式工作,而Facade管理您的调用的异步方面。