【问题标题】:MVVM: What to do when a service call failsMVVM:服务调用失败时该怎么办
【发布时间】:2011-04-05 07:32:31
【问题描述】:
我有使用 MVVM 模式的 WP7 应用程序。当用户在应用程序中从一个页面转到另一个页面时,我必须调用 WCF 服务来获取数据。
这一切正常。但是,当服务调用失败时,我该怎么办?
现在我在视图模型中执行MessageBox.Show("Some error message.");,但这不应该在视图中以某种方式完成吗?我该怎么做?使用数据绑定?怎么样?
如果服务调用失败,我也想返回:
if ( NavigationService.CanGoBack ) { NavigationService.GoBack(); }
但是我将如何使用 MVVM 在视图中实现这一点?
【问题讨论】:
标签:
.net
silverlight
windows-phone-7
mvvm
【解决方案1】:
我是开源 MVVM 框架 Catel 的开发人员之一。我们支持多种服务,其中包含服务的真实实现和测试实现。这样,如果你需要显示一个消息框,你可以这样做:
var messageService = GetService<IMessageService>();
messageService.Show("This is a message");
当然,在此服务的单元测试版本中,不会显示实际的消息框,但您可以添加预期结果,以便实际测试用户回答 OK 或取消。
导航服务也一样:
var navigationService = GetService<INavigationService>();
navigationService.Navigate("/UI/Pages/MyNewPage.xaml");
// OR
navigationService.Navigate<MyViewModel>();
在我看来,这是你需要走的路,像 Caliburn.Micro 和 Catel 这样的优秀框架开箱即用地支持这一点。
【解决方案2】:
我使用的是 Caliburn Micro MVVM 框架,有了它你可以通过以下方式处理这些问题。
来自视图模型的通知可以通过多种不同的方式完成,如果您在 CM 中使用协程,那么您可以创建一个 NotificationResult 与视图模型单独交互。另一种方法是让某种通知源视图模型绑定到视图中的通知控件。我在Windows Phone 7 Notification Control 有一些用于这种方法的示例代码。
在 CM 框架中有一个 INavigationService 接口,您可以将其声明为视图模型的依赖项并通过该接口进行导航。这样做的好处是它都是可单元测试的。