在ViewModel中访问WCF

时间:2014-01-25 00:27:52

标签: c# wpf wcf mvvm mvvm-light

我目前在我的WPF应用程序中有许多ViewModel需要来自WCF服务的数据。目前,每个ViewModel都存储对(不同)serviceproxy的引用。问题是,在应用程序退出时,WCF未正常关闭(服务器报告意外关闭连接),如果用户长时间处于空闲状态,则连接超时。

我在考虑在我的应用程序中使用WCF的两种不同方法:

  1. 在ViewModel中创建serviceproxy并访问Using()语句中的数据,以便我只保持连接短时间打开。

  2. 使用所有ViewModel可以为每次调用访问的WCF单例。

  3. (1)的问题是我调用了WCF for CanExecute方法来确定我的GUI上是否启用了按钮。我担心制作这么多代理会变得昂贵而且速度慢。

    我看到的问题(2)是我已经注意到的问题:如果WCF连接长时间处于空闲状态,它会超时并且代理出现故障。这意味着更多的错误处理。

    如果有人对这种数据访问有良好的模式,我会很感激。

    编辑:我知道使用WCF对CanExcute来说是一个坏主意。如果它导致问题,我会改变它,但现在这个应用程序有3个用户。我只是在寻找一种从我的ViewModel中访问服务的好方法,它可以防止断开连接并且也是可测试的。

2 个答案:

答案 0 :(得分:1)

从CanExecute代码执行阻塞调用(如WCF调用)是不好的做法。这些调用正在运行时,您的UI被阻止。并且CanExecute被调用太多次了,所以你的服务器也会遇到性能问题......

您需要的是服务器向CanExecutes已更改的客户端发出信号的方式。例如:当一个客户端删除客户时,服务器可以引发其他客户可以订阅的“客户已删除”事件,如果他们的屏幕上有该特定客户,则禁用其“编辑”按钮。

在网上搜索发布/订阅以获取实现该模式的帮助。 您可以从IDesign.net网站下载使用WCF的“发布订阅框架”:http://www.idesign.net/Downloads/GetDownload/2032

答案 1 :(得分:0)

  1. 在CanExceute中进行wcf调用是不好的做法
  2. 操作完成后,客户端应始终关闭连接,连接不应打开太长时间
  3. 如果有多个客户端,但所有客户端都想显示相同的状态,那么将服务器设为singleTon
  4. 如果由于服务器中的某些更改而需要通知,请使用wcf回调,当服务器发生更改时,服务器将调用客户端