【发布时间】:2010-04-30 15:04:04
【问题描述】:
您将如何构建用于在 silverlight 应用程序中调用 wcf 服务的代码?
只使用一次实例化的 wcf 服务代理(又名单例)并在整个 SL 应用程序中使用它? 如果是这样,您是如何解决 ws-call-completed 事件的退订控件的?
或
为每个 ws 调用创建 wcf 服务代理?那你在哪里关闭代理呢?
【问题讨论】:
标签: silverlight
您将如何构建用于在 silverlight 应用程序中调用 wcf 服务的代码?
只使用一次实例化的 wcf 服务代理(又名单例)并在整个 SL 应用程序中使用它? 如果是这样,您是如何解决 ws-call-completed 事件的退订控件的?
或
为每个 ws 调用创建 wcf 服务代理?那你在哪里关闭代理呢?
【问题讨论】:
标签: silverlight
这是我发现可行的应用程序结构:
对于每个服务客户端部分类,我都有另一个生成的部分类,其中对于每个服务方法,我都有一个返回 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 堆栈(更容易模拟,更容易测试)此外,这些模型类负责:
【讨论】: