English 中文(简体)
Silverlight,异步,惰性加载,最好的方式是什么?
原标题:
  • 时间:2008-12-10 08:23:05
  •  标签:

我开始使用Silverlight/Flex,很快遇到了异步服务调用的问题。我已经习惯了用一种服务器提取机制或另一种服务器提取机制以面向对象的方式解决数据访问问题。

我有下面这个简单的代码示例:

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中是不可能的。懒加载强制你使用回调函数。在我看来,上面的简单示例会非常混乱。

有人可以给我一个有结构的方式来实施上述内容吗?

编辑:

  • The problem is the same for Flex/Silverlight, pseudo code would do fine
  • Its not really ORM related but most orms use lazy loading so i ll remove that tag
  • The problem is lazy loading in the model
  • The above example would be very doable of all data was in memory but we assume some has to be fetched from the server
  • Closueres dont help since sometimes data is already loaded and no asynchronous fetch is needed
最佳回答

C# 5 async / await construct will almost exactly what I want..

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

问题回答

Yes I must agree that O/R mapping is usually done on the server-side of your application. In SilverLight asynchronous way of execution is the desired pattern to use when working with services. Why services? Because as I said before there is no O/R mapping tool at the moment that could be used on the client-side (SilverLight). The best approach is to have your O/R mapped data exposed by a service that can be consumed by a SilverLight application. The best way at the moment is to use Ado.Net DataServices to transport the data, and on the client-side to manage the data using LINQ to Services. What is really interesting about ADS (former Astoria project) is that it is designed to be used with Entity Framework, but the good folks also implemented support for IQueriable so basically you can hook up any data provider that support LINQ. To name few you can consider Linq To Sql, Telerik OpenAccess, LLBLGen, etc. To push the updates back to the server the data source is required to support the ADS IUpdateable.

你可以通过我在这里准备的一系列博客文章来了解如何完成此操作: 入门ADO.NET数据服务和Telerik Open Access

我不会说Silverlight,但Flex是一种网页浏览器客户端技术,不含任何数据库驱动程序嵌入在Flash运行时中。相反,您可以通过HTTP协议与web服务器进行交互。在中间层Web服务器中进行ORM与数据库连接,例如Java JDBC。Hibernate ORM和iBATIS是Java中间层空间中的两种流行选择。

同样因为这个原因:

分布式计算谬误

你不应该在 Flex 客户端和其中间层服务之间进行同步交互。当前禁止使用同步网络操作,因为这是设计不良应用程序的标志性特征——由于上面链接中列出的原因,该应用程序可能(并经常会)导致非常糟糕的用户体验。

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

所有这些似乎与您发布的调查性质非常无关,但您的发布表明您在完全错误的基础上了解具有异步和事件驱动程序的客户端技术的基本架构。这些RIA客户端技术完全是有意设计成这种方式的。因此,如果您想使用它们获得良好和生产力的体验,您需要了解它们的思维方式。

我在这篇文章中更加详细地介绍了这个问题,并且从Flex角度进行了阐述。

Flex异步I / O与Java和C#显式线程编程的比较

在我与 Flex 的直接经验中,我认为这次讨论变得太复杂了。

您的面向对象的概念没有在同步和异步之间有所区别。唯一的区别是您使用事件处理程序来处理DAL中的主机对话,而不是从方法调用返回的内容。这通常完全在主机端进行,并且与Flex或Silverlight无关。 (如果您正在使用AIR用于工作站应用程序,则可能在客户端代码中,但情况相同。同样,如果您正在使用长期的AJAX。当然,Silverlight没有AIR的相应。)

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

Flex采用单线程模型。如果您对Web服务器进行同步调用,将会阻塞整个应用程序的GUI。在调用完成(或在网络错误条件下超时等)之前,用户将无法使用应用程序。

当然,真正的RIA程序并不是这样编写的。它们的GUI通过使用异步调用保持可访问和响应用户。这也使得真正进度指示器成为可能,如果交互的性质需要,则提供取消按钮等。

旧的、用户体验不佳的 Web1.0 应用程序表现出同步行为在它们与 Web 层的交互中。

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

这是另一篇深入探讨异步、消息/事件驱动分布式应用程序体系结构的文章:

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

Silverlight是客户端技术,对象关系映射完全在服务器上进行。因此,您必须将ORM从Silverlight中忘记。

Following your example what you have to do is to create a webservice (SOAP, REST...) that can give your silverlight client the complete "Order" object. Once you have the object you can work with it with no communication with the server in a normal - synchronous way.

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

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





相关问题
热门标签