2010-04-30 57 views
3

你将如何构造在Silverlight应用程序中调用wcf服务的代码?Silverlight使用Wcf服务的最佳实践?

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

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

回答

7

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

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

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

    这样的Web服务调用变得简单:

    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); 
    
  • (如数据是由多个组件共享,添加消息动态更新最初检索到的数据等。 )在堆栈中添加另一个元素很有帮助 - Model。

    因此,如果我有一个服务MyDataService我会有一个模型类叫MyDataServiceModel。它将作为singleton在容器中注册,并将被注入到需要它的视图模型中。这样的ViewModels聊到这个类,当他们需要的数据(因此而不是调用MyServiceClient.GetAllMyData它会调用MyDataServiceModel.GetAllMyData

    这样的ViewModels是完全独立的WCF栈的(更容易嘲笑,更容易测试)此外,这些模型类照顾:

    • 数据变换从/向DTO
    • 丰富和组合数据(一个模型方法可以从一个以上的请求加入数据)
    • 处理问题等节流在一个(例如典型的场景中,用户选择的事组合框,它导致了重新要求发送到服务器以检索该选择的数据,同时该请求正在被执行,用户进行了另一次更改,但由于某些原因,响应失序)等。通过WCF数据会话
+1

能否请您解释一下在由服务推动初始加载

  • 结合数据拉,你如何生成返回的IObservable服务方法的版本?用T4还是别的? – Harm 2012-04-09 10:05:27