如何构建在silverlight应用程序中调用wcf服务的代码?
只使用一次实例化的wcf服务代理(又名单身)并在整个SL应用程序中使用它? 如果是这样,你是如何解决ws-call-completed事件的取消订阅控件的呢?
或
为每个ws-call创建wcf服务代理?你在哪里关闭代理呢?
答案 0 :(得分:7)
这是我认为可行的应用程序结构:
对于每个服务客户端部分类,我有另一个生成的部分类,其中每个服务方法我都有一个返回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堆栈(更容易模拟,更容易测试)另外这些模型类负责: