0

我开始使用 silverlight/flex 并立即遇到了异步服务调用。我习惯于使用一种或另一种服务器获取机制以 OO 方式解决数据访问问题。

我有以下简单的代码示例:

public double ComputeOrderTotal(Order order) 
{ 
   double total = 0;
   // OrderLines are lazy loaded
   foreach (Orderline line in order.Orderlines) 
   { 
       // Article,customer are lazy loaded 
       total = total + line.Article.Price - order.Customer.discount;
   }
   return total;
}

如果我理解正确,这段代码在 Flex/Silverlight 中是不可能的。延迟加载迫使您使用回调。IMO 上面的简单示例将是一团糟。

谁能给我一种结构化的方式来实现上述内容?

编辑:

  • Flex/Silverlight 的问题是一样的,伪代码就可以了
  • 它不是真正与 ORM 相关,但大多数 orm 使用延迟加载,所以我将删除该标签
  • 问题是模型中的延迟加载
  • 上面的示例非常可行,因为所有数据都在内存中,但我们假设必须从服务器获取一些数据
  • Closueres 没有帮助,因为有时数据已经加载并且不需要异步获取
4

7 回答 7

1

是的,我必须同意 O/R 映射通常在应用程序的服务器端完成。在 SilverLight 中,异步执行方式是使用服务时需要使用的模式。为什么是服务?因为正如我之前所说,目前没有可以在客户端(SilverLight)使用的 O/R 映射工具。最好的方法是让您的 O/R 映射数据由可以被 SilverLight 应用程序使用的服务公开。目前最好的方法是使用 Ado.Net DataServices 传输数据,并在客户端使用 LINQ to Services 管理数据。ADS(前 Astoria 项目)真正有趣的是它被设计为与实体框架一起使用,但好人也实现了对 IQueriable 的支持,所以基本上你可以连接任何支持 LINQ 的数据提供程序。OpenAccess、LLBLGen 等。要将更新推送回服务器,数据源需要支持 ADS IUpdateable。

您可以在我在这里准备的一系列博文中确切了解如何做到这一点:ADO.NET 数据服务和 Telerik 开放访问入门

于 2008-12-19T08:05:55.853 回答
1

我无法与 Silverlight 交谈,但 Flex 是一种 Web 浏览器客户端技术,在 Flash 运行时中没有嵌入任何数据库驱动程序。您可以改为与 Web 服务器进行 HTTP 协议交互。它位于中间层 Web 服务器中,您可以在其中针对数据库连接执行任何 ORM,例如 Java JDBC。Hibernate ORM 和 iBATIS 是 Java 中间层空间中的两个流行选择。

另外,正因为如此:

分布式计算的谬误

您不执行从 Flex 客户端到其中间层服务的同步交互。同步网络操作近来已被禁止,并且是设计不佳的应用程序的标志 - 由于上述链接中列举的原因,该应用程序可能(并且通常会)表现出非常糟糕的用户体验。

您改为进行异步调用以检索数据,将数据加载到客户端应用程序的模型对象中,然后继续在模型上实现操作。使用 Flex 和 BlazeDS,您还可以让中间层将数据推送到客户端并异步更新客户端的模型对象。(数据绑定是响应以事件驱动方式更新的数据的一种方式。)

所有这一切似乎与您发帖中询问的性质相去甚远——但您的发帖表明您在如何理解将异步和事件驱动编程融入其基础的客户端技术方面处于完全错误的基础上建筑学。这些 RIA 客户端技术完全是故意这样设计的。因此,如果您想获得良好且富有成效的使用体验,您将需要学习他们的思维方式。

在这篇文章中,我会以 Flex 的视角更详细地讨论这个问题:

Flex 异步 I/O 与 Java 和 C# 显式线程

于 2008-12-23T02:47:52.773 回答
1

根据我对 Flex 的直接体验,我认为这个讨论变得太复杂了。

您的概念 OO 视图在同步和异步之间没有什么不同。唯一的区别是您使用事件处理程序来处理 DAL 中的主机对话,而不是从方法调用返回的内容。这通常完全发生在主机端,与 Flex 或 Silverlight 无关。(如果您将 AIR 用于工作站应用程序,那么它可能在客户端代码中,但同样适用。如果您使用的是长时间的 AJAX。当然,Silverlight 没有 AIR 等效项。)

我已经能够设计出我需要的一切,而无需进行任何其他更改来适应异步。

于 2008-12-23T02:55:19.233 回答
1

Flex 有一个单线程模型。如果您对 Web 服务器进行同步调用,您将阻止应用程序的整个 GUI。用户将有一个冻结的应用程序,直到调用完成(或在网络错误条件下超时等)。

当然,真正的 RIA 程序不是这样编写的。通过使用异步调用,他们的 GUI 仍然可以访问并响应用户。如果交互的性质允许,它还可以提供提供取消按钮等的真实进度指示器。

旧的、糟糕的用户体验 Web 1.0 应用程序在与 Web 层的交互中表现出同步行为。

正如我的链接文章所指出的,异步单线程模型与 ActionScript3 闭包相结合是一件好事,因为它是一种比替代方案(编写多线程应用程序)更简单的编程模型。多线程是编写客户端-服务器 Java Swing 或 C# .NET WinForm 应用程序的方法,以便在 GUI 中实现类似的响应式、始终流畅的用户体验。

这是另一篇深入探讨异步、消息传递/事件驱动的分布式应用程序架构的整个主题的文章:

构建有效的企业分布式软件系统 数据驱动的通信与行为驱动的通信

于 2008-12-23T05:42:48.443 回答
0

Silverlight 是一种客户端技术,对象-关系映射完全发生在服务器中。所以你必须忘记 Silverlight 中的 ORM。

按照您的示例,您要做的是创建一个 Web 服务(SOAP、REST ...),它可以为您的 silverlight 客户端提供完整的“订单”对象。一旦你有了对象,你就可以使用它,而无需以正常的同步方式与服务器通信。

于 2008-12-12T11:07:49.620 回答
0

谈到 Silverlight,您绝对应该检查RIA 服务

简单地说,它将 DataContext 从服务器带到客户端,您可以从那里异步查询它(无需手动编写 WCF 服务,这一切都由 RIA 完成)。

于 2009-12-21T16:23:26.487 回答
0

C# 5 async / await 构造几乎正是我想要的..

观看安德斯·海尔斯伯格的演讲

于 2010-11-12T12:04:49.847 回答