你将如何构建在silverlight应用程序中调用wcf服务的代码?
只使用一次实例化的wcf服务代理(又名单身)并在整个SL应用程序中使用它?如果是这样,你是如何解决ws-call-completed事件的取消订阅控件的?
要么
为每个ws调用创建wcf服务代理?你在哪里关闭代理呢?
这是我发现可行的应用程序结构:
对于每个服务客户端部分类,我有另一个生成的部分类,其中对于每个服务方法,我有一个返回IObservable的版本.
例如,如果我的服务客户端具有方法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);
Run Code Online (Sandbox Code Playgroud)一旦应用程序变得更加复杂(例如,数据由多个组件共享,您添加动态更新最初检索数据的消息传递等),在堆栈中添加另一个元素是有用的 - 模型.
因此,如果我有一个服务,MyDataService
我会有一个名为的模型类MyDataServiceModel
.它将作为单例注册在容器中,并将注入需要它的视图模型中.因此,当视图模型需要数据时,MyServiceClient.GetAllMyData
它会与这个类进行对话(所以不要调用它来调用它MyDataServiceModel.GetAllMyData
.
这种方式viewmodels完全独立于WCF堆栈(更容易模拟,更容易测试)另外这些模型类负责:
归档时间: |
|
查看次数: |
1739 次 |
最近记录: |