客户端服务器更新的设计模式

时间:2013-01-15 08:36:30

标签: architecture client-server graniteds

我正在编写一个在客户端使用MVC的Flex应用程序。它使用GraniteDS,因此具有远程延迟加载和反向延迟加载功能。

用户登录应用程序,然后单击按钮以更新其电子邮件地址。然后调用控制器,但我不确定接下来要做什么命令。我可以看到以下选项:

选项

  1. 在客户端上更新模型,然后将更新发送到服务器。如果服务器抛出错误,则告诉用户并要求他们重新加载Flex应用程序,因为数据现在是异相的。否则假设更新正常;
  2. 在服务器响应之后,控制器将数据发送到服务器,然后控制器使用更新的数据更新客户端模型。如果没有收到服务器响应,则告诉用户出现错误并要求他们重新加载应用程序,因为数据现在可能不同步。
  3. 选项2似乎更好但我不确定如何实现它。我有什么选择?

    解决方案

    1. 克隆 MyUser 并将克隆发送到服务器,当服务器返回 MyUser 然后更新模型。如何在 MyUser 的集合中处理更深层次的嵌套对象,因为克隆只会复制原始集合而不能克隆它?
    2. 使用更改的数据将 MyUser.id 发送到服务器。使用 id 在服务器上加载 MyUser ,然后修改其数据。在服务器上修改数据后,将 MyUser 返回给客户端,以便控制器可以更新模型。
    3. 解决方案2似乎是一种非常糟糕的方法,因为它绕过了Lazy / Reverse Lazy加载的GraniteDS功能。

      这是他们最好的做法吗?

1 个答案:

答案 0 :(得分:0)

如果在保存flex对象时遇到数据冲突,重新加载整个flex应用程序是一个不太方便的解决方案,但它的工作原理非常可靠。 对于请求:也许您应该只显示一条消息,并允许Flex客户端重新发送请求(例如:网络问题),并且它应该在大多数情况下都可以。添加一个计数器,如果在n失败后让您无法重启应用程序(您可以使用URLRequest对Flex应用程序进行编程以重新加载)。

关于克隆MyUser:如果你使用基本的AMF序列化与ObjectUtil.copy(),它将复制嵌套字段,因为它确实是基于IExternalizable的“深层复制”,花岗岩序列化是基于此。所以关于克隆对象的解决方案应该可行。

你可以按照你想要的方式自由使用granits,例如,许多人更喜欢禁用懒惰功能,即使它带来了自己的问题。我觉得处理数据冲突总是一件习惯的事情,不要指望一个框架,甚至是Granite,来解决所有问题。