Silverlight,异步,延迟加载什么是最好的方法?

时间:2008-12-10 08:23:06

标签: flex silverlight lazy-loading

我开始使用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相关,但大多数的运算符使用延迟加载,所以我将删除 标签
  • 问题是模型中的延迟加载
  • 以上示例将非常可靠,但所有数据都在内存中 我们假设有一些必须从中获取 服务器
  • Closueres没有帮助,因为有时数据已经加载并且不需要异步提取

7 个答案:

答案 0 :(得分:1)

是的我必须同意O / R映射通常在应用程序的服务器端完成。 在SilverLight中,异步执行方式是使用服务时所需的模式。为什么服务?因为正如我之前所说的那样,目前还没有可以在客户端使用的O / R映射工具(SilverLight)。最好的方法是让SilverLight应用程序可以使用的服务公开您的O / R映射数据。目前最好的方法是使用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

答案 1 :(得分:1)

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

另外,因为这个:

Fallacies of Distributed Computing

您不会从Flex客户端到其中间层服务进行同步交互。如今,同步网络操作已成为禁止使用,并且是设计不佳的应用程序的标志性特征 - 由于上述链接中列举的原因,应用程序可以(并且经常会)表现出非常糟糕的用户体验。

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

所有这些可能看起来距离您的帖子中的查询性质还很远 - 但是您的帖子表明您对于如何理解具有异步和事件驱动编程的客户端技术完全不正确进入他们的基础架构。这些RIA客户端技术完全是故意设计的。因此,如果您希望获得使用它们的良好且富有成效的经验,您将需要学习他们的思维模式。

我在本文中更详细地介绍了这一点,并使用Flex透视图:

Flex Async I/O vs Java and C# Explicit Threading

答案 2 :(得分:1)

根据我对Flex的直接体验,我认为这个讨论过于复杂。

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

我已经能够设计我需要的一切,而无需任何其他更改来容纳异步。

答案 3 :(得分:1)

Flex有一个单线程模型。如果对Web服务器进行同步调用,则会阻止应用程序的整个GUI。在呼叫完成之前(或者在网络错误情况下超时等),用户将拥有冻结的应用程序。

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

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

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

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

Building Effective Enterprise Distributed Software Systems data-driven communication vs behavior-driven communication

答案 4 :(得分:0)

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

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

答案 5 :(得分:0)

谈到Silverlight,你一定要检查RIA services

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

答案 6 :(得分:0)

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

watch presentation by anders hejlsberg