Apache Flex Silverlight、异步、延迟加载的最佳方式是什么?

mbjcgjjk  于 12个月前  发布在  Apache
关注(0)|答案(7)|浏览(147)

我开始使用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中是不可能的。延迟加载迫使你使用回调。在我看来,上面的简单解释将是一个大混乱。
有没有人给予我一个结构化的方法来实现上述内容?
编辑:

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

vsikbqxv

vsikbqxv1#

是的,我必须同意O/RMap通常是在应用程序的服务器端完成的。在Silverlight中,异步执行方式是使用服务时所需的模式。为什么是服务?因为正如我之前所说的,目前还没有可以在客户端使用的O/RMap工具(Silverlight)。最好的方法是让您的O/RMap数据由Silverlight应用程序可以使用的服务公开。目前最好的方法是使用Ado.Net DataServices来传输数据,在客户端使用LINQ to Services管理数据。ADS真正有趣的地方是(前Astoria项目)的一个重要原因是它被设计为与Entity Framework一起使用,但是优秀的人也实现了对IQueriable的支持,所以基本上你可以连接任何支持LINQ的数据提供程序。举几个例子,你可以考虑Linq To Sql,Telerik OpenAccess,LLBLGen,为了将更新推回服务器,数据源需要支持ADS IUpdateable。
你可以在我准备的一系列博客文章中看看这是如何做到的:Getting Started with ADO.NET Data Services and Telerik Open Access

lokaqttq

lokaqttq2#

我不知道Silverlight是什么,但Flex是一种Web浏览器客户端技术,在Flash运行时中没有嵌入任何数据库驱动程序。您可以与Web服务器进行HTTP协议交互。它位于中间层Web服务器中,您可以在其中执行与数据库连接有关的任何ORM,例如Java JDBC。Hibernate ORM和iBATIS是Java中间层空间中的两个流行选择。
也正因为如此:
Fallacies of Distributed Computing
你不能从Flex客户端到它的中间层服务进行同步交互。同步网络操作现在已经被禁止了,并且是设计糟糕的应用程序的标志性特征-由于上面链接中列举的原因,应用程序可以(并且通常会)表现出非常糟糕的用户体验。
相反,您可以通过调用BRAC来检索数据,将数据加载到客户端应用程序的模型对象中,然后继续在模型上实现操作。使用Flex和BlazeDS,您还可以让中间层将数据推送到客户端,并异步更新客户端的模型对象。(数据绑定是以事件驱动方式响应数据更新的一种方式。)
所有这些可能看起来与您帖子中的查询性质相去甚远-但您的帖子表明您在如何理解具有异步和事件的客户端技术方面完全不正确-这些RIA客户端技术完全是故意设计的,所以如果你想了解他们的思维模式,一个良好的和富有成效的经验使用它们。
在本文中,我将从Flex的Angular 对此进行更详细的讨论:
Flex Async I/O vs Java and C# Explicit Threading

3ks5zfa0

3ks5zfa03#

根据我对Flex的直接体验,我认为这个讨论变得太复杂了。
从概念上讲,同步和同步之间的OO视图没有什么不同。唯一的区别是,您使用事件处理程序来处理DAL中的主机会话,而不是从方法调用返回的东西。这通常完全发生在主机端,与Flex或Silverlight无关。(如果你正在为工作站应用程序使用AIR,那么它可能在客户端代码中,但同样适用。如果你正在使用延长的AJAX。当然,Silverlight没有AIR等价物。)
我已经能够设计我所需要的一切,而无需任何其他更改,以适应新的。

jvidinwx

jvidinwx4#

Flex有一个单线程模型。如果你对Web服务器进行同步调用,你会阻塞应用程序的整个GUI。用户将拥有一个冻结的应用程序,直到调用完成(或在网络错误条件下超时等)。
当然,真实的RIA程序并不是这样编写的。它们的GUI仍然可以访问,并通过使用JavaScript调用对用户进行响应。如果交互的性质需要,它还可以有真实的进度指示器,提供取消按钮等。
旧的、糟糕的用户体验的Web 1.0应用程序在与Web层的交互中表现出同步行为。
正如我的链接文章所指出的那样,与JavaScript 3闭包相结合的JavaScript单线程模型是一件好事,因为它是一个比替代方案(编写多线程应用程序)简单得多的编程模型。多线程是编写客户端-服务器Java Swing或C# .NET WinForm应用程序的方法,以便在GUI中实现类似的响应性,始终流畅的用户体验。
这是另一篇文章,深入研究异步,消息/事件驱动的分布式应用程序架构的整个主题:
Building Effective Enterprise Distributed Software Systemsdata-driven communication vs behavior-driven communication

b5buobof

b5buobof5#

Silverlight是一种客户端技术,对象-关系Map完全发生在服务器端。所以你必须忘记Silverlight中的ORM。
按照你的例子,你需要做的是创建一个Web服务(SOAP,REST.),它可以给予你的Silverlight客户端完整的“Order”对象。一旦你有了这个对象,你就可以使用它,而不需要以正常的同步方式与服务器通信。

ego6inou

ego6inou6#

说到Silverlight,你绝对应该检查RIA services
简单地说,它将DataContext从服务器带到客户机,您可以从客户机异步查询它(不需要手工编写WCF服务,全部由RIA完成)。

i2loujxw

i2loujxw7#

C# 5的C/ await构造几乎正是我想要的。
watch presentation by anders hejlsberg

相关问题