在Windows Phone 7的MVVM应用程序中使用REST Web服务的良好架构?

时间:2010-07-05 21:22:39

标签: c# silverlight asynchronous windows-phone-7

我在确定从Web服务到UI的最佳方式时遇到了一些麻烦。

鉴于WebClient的异步特性,您将如何构建它?

  • 模型使用WebClient与webservice交谈
  • ViewModel向模型询问数据
  • 视图数据绑定到ViewModel

在Async完成事件中,我需要将数据从模型中取回ViewModel,这些是我想过的。

  1. 我可以在模型中触发ViewModel订阅的事件。
  2. 我或许可以做一些传递回调的事情?
  3. 或者我应该在ViewModel和模型之间进行第二级INotifyPropertyChanged事件?
  4. 或者我非常困惑并完全误解了MVVM?

2 个答案:

答案 0 :(得分:4)

这取决于你想要了解MVVM的纯粹主义。

您可以将API本身视为您的模型,在这种情况下,ViewModel具有WebClient,并且在Async完成后您将设置您的属性(并且它们将反过来从其setter中触发PropertyChanged)。

或者您可以拥有一个包含WebClient代码的本地模型(听起来就像您一样)。在这种情况下,我的个人方法将具有从Async完成事件触发的“ModelUpdated”事件。 (你的选择1)。

您的ViewModel可以侦听此事件,并触发PropertyChanged(null)以使View查询所有属性,或触发多个PropertyChanged事件。请记住,您不仅限于从您的安装者中解雇PropertyChanged。没有什么可以阻止你使用像

这样的方法
private void FireMultipleProperties(){
NotifyPropertyChanged("Property1");
NotifyPropertyChanged("Property2");
NotifyPropertyChanged("Property3");
}

因此,您可以在模型完成填充时调用该方法,并且您的UI将在触发时调用更新每个属性。如果您拥有大量属性并且不希望使用PropertyChanged(null)一次解除所有属性,则只需执行此操作。

答案 1 :(得分:1)

我认为你需要在你的架构中引入一个新层;服务层。通常,我将相关服务传递给我的ViewModel,ViewModel处理异步调用并显示繁忙状态和所有有趣的东西。

例如,如果您有一个产品型号,而ProductListViewModel带有一组产品和一个搜索命令,那么您将引入一个ProductSearchService(或ProductLoadService来加载所有产品)。然后我将ProductSearchService传递给您的ProductListViewModel构造函数(依赖注入),并让ViewModel通过调用相关的服务方法并加载响应来控制Products(模型对象)的检索。

  • ProductListService返回产品(模型)列表
  • ProductListViewModel使用ProductListService获取产品
  • ProductListView绑定到ProductListViewModel中的ProductList ObservableCollection。

这种模式基本上类似于模型 - 视图 - 控制器,其中ViewModel承担更多的Controller职责。

由于您提到基于REST的Web服务,我有一个示例博客文章,将MVC 2 JSON结果用作Win Phone 7应用程序的服务层:Data Driven Win Phone 7 Apps with MVC 2 JSON services