使用Silverlight的Wcf服务的最佳实践?

时间:2010-04-30 15:04:04

标签: silverlight

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

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

为每个ws-call创建wcf服务代理?你在哪里关闭代理呢?

1 个答案:

答案 0 :(得分:7)

这是我认为可行的应用程序结构:

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

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

    这样,网络服务电话变得简单:

    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

    这样viewmodels完全独立于WCF堆栈(更容易模拟,更容易测试)另外这些模型类负责:

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