你将如何构造在Silverlight应用程序中调用wcf服务的代码?Silverlight使用Wcf服务的最佳实践?
只使用一次实例化的wcf服务代理(又名单身人士)并在整个SL应用程序中使用它? 如果是这样,您是如何解决ws-call-completed事件的取消订阅控制的?
或
为每个ws-call创建wcf服务代理?那么你在哪里关闭代理?
你将如何构造在Silverlight应用程序中调用wcf服务的代码?Silverlight使用Wcf服务的最佳实践?
只使用一次实例化的wcf服务代理(又名单身人士)并在整个SL应用程序中使用它? 如果是这样,您是如何解决ws-call-completed事件的取消订阅控制的?
或
为每个ws-call创建wcf服务代理?那么你在哪里关闭代理?
这里的应用程序结构我发现可行的:
对于每一个服务客户端部分类我有另一个产生局部类,其中每一个服务方法我有一个返回的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栈的(更容易嘲笑,更容易测试)此外,这些模型类照顾:
能否请您解释一下在由服务推动初始加载