DDD和异步存储库

时间:2008-10-07 11:41:01

标签: flex asynchronous domain-driven-design ddd-repositories

我们正在使用RMI和JMS连接到Java后端的富客户端(用Flex编写)。我正在考虑以DDD方式实现客户端,以便它具有域对象上CRUD操作的存储库。

然而问题是所有后端通信都是异步的,我无法强迫客户端等待继续直到收到响应。这意味着,在较低级别,我可以在远程对象上调用方法,并获得AsyncToken作为返回值。然后我可以听到asynctoken上的事件,看看是否已经通过或者失败了。然而,这打破了存储库背后的主要思想,以隐藏客户端的技术细节。

我猜可能有两个选项:

  1. 让存储库中的方法返回asynctoken,这对我来说似乎是一个混乱的解决方案
  2. 让方法返回一个空集合(例如,对于findAll),它将在收到响应时被填充。
  3. 两者都有利弊,我想得到你们的一些意见。

    (更进一步,什么是好的缓存策略?依赖于这种情况,我不希望每次我请求所有实体时,存储库都会调用服务器。这将如何影响方法的签名存储库。)

3 个答案:

答案 0 :(得分:4)

Flex和Flash Remoting本质上是异步的,因此与这种模式作斗争会给你带来很多麻烦。我们的服务代表从每个方法返回AsyncToken,我们从来没有遇到任何问题。

如果要确保应用程序在结果/错误恢复之前不呈现新视图或执行其他逻辑,则可以执行以下操作:

  1. 为将调用“post result / fault code”
  2. 的自定义事件附加事件侦听器
  3. 进行异步通话
  4. 处理结果/错误
  5. 发送自定义事件以从#1
  6. 触发您的侦听器

    请记住,每次进行异步调用时,这都会导致很多恼人的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管理您的调用的异步方面。