【问题标题】: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 接口,您可以将其声明为视图模型的依赖项并通过该接口进行导航。这样做的好处是它都是可单元测试的。

      【讨论】:

      • 谢谢,您的“通知控件”帮了我很多忙!
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-14
      • 2021-06-21
      • 2011-09-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多