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

我在确定从Web服务到UI获取数据的最佳方法时遇到了一些麻烦。

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

  • Model使用WebClient与webservice通信
  • ViewModel向模型询问数据
  • View是数据绑定到ViewModel

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

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

这取决于你想要了解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)一次性解除它们,你只需要这样做。

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

例如,如果您有产品模型,ProductListViewModel包含产品集合和搜索命令,那么您将引入ProductSearchService(或者ProductLoadService来加载所有产品)。 然后,我将ProductSearchService传递给您的ProductListViewModel构造函数(dependency injection),并让ViewModel通过调用相关的服务方法并加载响应来控制Products(模型对象)的检索。

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

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

由于您提到基于REST的Web服务,我有一个示例博客文章,使用MVC 2 JSON结果作为Win Phone 7应用程序的服务层: 数据驱动Win Phone 7应用程序与MVC 2 JSON服务