代码之家  ›  专栏  ›  技术社区  ›  Julian de Wit

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

  •  0
  • Julian de Wit  · 技术社区  · 16 年前

    我开始使用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使用延迟加载,因此我将删除 那个标签
    • 问题是模型中的延迟加载
    • 上面的例子对于内存中的所有数据都是非常可行的,但是 我们认为必须从 服务器
    • closueres没有帮助,因为有时数据已经加载,不需要异步获取。
    7 回复  |  直到 14 年前
        1
  •  1
  •   user47678    16 年前

    是的,我必须同意O/R映射通常在应用程序的服务器端完成。 在Silverlight中,异步执行方式是使用服务时所需的模式。为什么要服务?因为正如我之前所说,目前没有可以在客户端(Silverlight)上使用的O/R映射工具。最好的方法是让可以由Silverlight应用程序使用的服务公开O/R映射数据。目前最好的方法是使用ADO.NET数据服务传输数据,并在客户端使用Linq to服务管理数据。ADS(前Astoria项目)真正有趣的是,它被设计用于实体框架,但是好人也实现了对iQuery的支持,所以基本上你可以连接任何支持Linq的数据提供者。举几个例子,你可以考虑linq to sql,telerik OpenAccess ,llblgen等。要将更新推回到服务器,需要数据源支持ADS iUpdatable。

    您可以查看我在这里准备的一系列blogposts中如何实现这一点: Getting Started with ADO.NET Data Services and Telerik Open Access

        2
  •  1
  •   RogerV    16 年前

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

    此外,由于这一点:

    Fallacies of Distributed Computing

    您不执行从Flex客户机到其中间层服务的同步交互。目前,同步网络操作已经变得言外之意,并且是设计糟糕的应用程序的标志性特征——由于上述链接列举的原因,应用程序可以(并且通常会)展现出非常糟糕的用户体验。

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

    所有这些看起来可能与你的发帖中的查询性质相差甚远,但是你的发帖表明你在如何理解客户端技术上的一个完全错误的基础上,这些技术具有异步和事件驱动的编程,并且已经融入了它们的基本体系结构中。这些RIA客户机技术完全是以这种方式设计的。因此,如果你想有一个良好的和富有成效的使用他们的经验,你需要学习他们的思维方式。

    在本文中,我将以一种灵活的视角更详细地介绍这一点:

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

        3
  •  1
  •   dkretz    16 年前

    在我对flex的直接经验中,我认为这个讨论变得太复杂了。

    在同步和异步之间,概念上的OO视图没有区别。唯一的区别是,使用事件处理程序处理DAL中的主机会话,而不是方法调用返回的内容。这通常完全发生在主机端,与flex或silverlight无关。(如果您在工作站应用程序中使用air,那么它可能在客户机代码中,但同样适用。如果您使用的是延长的Ajax。当然,Silverlight没有空气当量。)

    我已经能够设计我所需要的一切,而不需要任何其他的改变来适应异步。

        4
  •  1
  •   RogerV    16 年前

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

    当然真正的RIA程序不是这样写的。他们的图形用户界面仍然可以通过使用异步调用来访问和响应用户。它还可以有实际的进度指示器来提供取消按钮,如果交互的性质允许这样做的话。

    旧的、糟糕的用户体验Web1.0应用程序在与Web层的交互中显示出同步行为。

    正如我的链接文章所指出的,异步单线程模型加上actionscript3闭包是一件好事,因为它是一个比编写多线程应用程序更简单的编程模型。多线程是编写客户机服务器JAVA Swing或C.Y..NET WiFrm应用程序的方法,以便在GUI中始终实现类似响应的、流体化的用户体验。

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

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

        5
  •  0
  •   DaniCE    16 年前

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

    在您的示例之后,您需要做的是创建一个Web服务(SOAP、REST…),它可以为您的Silverlight客户端提供完整的“order”对象。 一旦你拥有了对象,你就可以在不与服务器进行正常同步通信的情况下使用它。

        6
  •  0
  •   gius    15 年前

    说到Silverlight,你一定要检查一下 RIA services .

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

        7
  •  0
  •   Julian de Wit    14 年前

    C 5 async/await构造几乎完全符合我的需要。

    watch presentation by anders hejlsberg

    推荐文章