【问题标题】:Best practice for using Wcf service by silverlight?Silverlight 使用 Wcf 服务的最佳实践?
【发布时间】:2010-04-30 15:04:04
【问题描述】:

您将如何构建用于在 silverlight 应用程序中调用 wcf 服务的代码?

只使用一次实例化的 wcf 服务代理(又名单例)并在整个 SL 应用程序中使用它? 如果是这样,您是如何解决 ws-call-completed 事件的退订控件的?

为每个 ws 调用创建 wcf 服务代理?那你在哪里关闭代理呢?

【问题讨论】:

    标签: silverlight


    【解决方案1】:

    这是我发现可行的应用程序结构:

    • 应用程序被分成模块(Prism,但可以是任何东西) - 每个垂直功能的模块。
    • 每个模块都有自己的一组服务客户端类(由 slsvcutil 生成)
    • 对于每个服务客户端部分类,我都有另一个生成的部分类,其中对于每个服务方法,我都有一个返回 IObservable 的版本。

      例如如果我的服务客户端有方法GetAllMyDataAsync() 和事件GetAllMyDataCompleted,则生成的方法签名将为IObservable<MyDataDto[]> GetMyData() 此方法将处理订阅/取消订阅事件、身份验证、错误处理和其他基础设施问题。

      这样web-service调用就变得简单了:

      new MyServiceClient().GetAllMyData().Subscribe(DoSomethingWithAllMyData)

      有了这个,我可以轻松地加入来自多个请求的数据,例如(仅用于演示目的,请勿在实际应用中尝试):

      var des = (from d in new MyServiceClient().GetMyDataItem()
                 from e in new MyServiceClient().GetDataItemEnrichment(d)  
                 select new EnrichedData { Data = d, Enrichment = e});  
      des.Subscribe(DoSomethingWithEnrichedData);
      
    • 一旦应用程序变得更加复杂(例如,数据由多个组件共享,您添加动态更新最初检索到的数据的消息传递等),在堆栈中添加另一个元素 - 模型会很有帮助。

      因此,如果我有一个服务MyDataService,我就会有一个名为MyDataServiceModel 的模型类。它将在容器中注册为单例,并将注入到需要它的视图模型中。因此,视图模型在需要数据时与此类对话(因此与其调用MyServiceClient.GetAllMyData,不如调用MyDataServiceModel.GetAllMyData

      这种方式视图模型完全独立于 WCF 堆栈(更容易模拟,更容易测试)此外,这些模型类负责:

      • 从/到 DTO 的数据转换
      • 丰富和合并数据(一种模型方法可以连接来自多个请求的数据)
      • 处理诸如限制之类的问题(例如,典型场景,用户在组合框中选择了某些内容,它导致请求被发送到服务器以检索该选择的数据,而正在执行该请求时,用户进行了另一项更改,但对于某些原因响应乱序)等。
      • 将通过 WCF 在初始加载时提取的数据与会话期间服务推送的数据相结合

    【讨论】:

    • 您能否解释一下,您如何生成返回 IObservable 的服务方法版本?用 T4 还是别的什么?
    • 你能解释一下吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-09-19
    • 2014-03-20
    • 2016-03-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多