【问题标题】:Good architecture for consuming a REST web service in an MVVM app for Windows Phone 7?在 Windows Phone 7 的 MVVM 应用程序中使用 REST Web 服务的良好架构?
【发布时间】:2010-07-05 21:22:38
【问题描述】:

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

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

  • 模型使用 WebClient 与 webservice 对话
  • ViewModel 向模型询问数据
  • View 数据绑定到 ViewModel

在异步完成事件中,我需要将模型中的数据返回到 ViewModel,这些是我考虑过的事情。

  1. 我可以在 ViewModel 订阅的模型中触发一个事件。
  2. 也许我可以通过传递回调来做点什么?
  3. 或者我应该在 ViewModel 和 Model 之间执行第二级 INotifyPropertyChanged 事件?
  4. 还是我很困惑,完全误解了 MVVM?

【问题讨论】:

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


    【解决方案1】:

    这取决于您对 MVVM 的追求程度。

    您可以将 API 本身视为您的模型,在这种情况下,ViewModel 具有 WebClient,并且在异步完成时您将设置您的属性(然后它们会从其设置器中触发 PropertyChanged)。

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

    您的 ViewModel 可以侦听此事件,并触发 PropertyChanged(null) 以让 View 请求所有属性,或者触发多个 PropertyChanged 事件。请记住,您不仅限于在设置器中触发 PropertyChanged。没有什么能阻止你拥有这样的方法

    private void FireMultipleProperties(){
    NotifyPropertyChanged("Property1");
    NotifyPropertyChanged("Property2");
    NotifyPropertyChanged("Property3");
    }
    

    因此,您可以在模型完成填充时调用该方法,并且您的 UI 将在它们被触发时调用更新每个属性。如果您有大量属性并且不想使用PropertyChanged(null) 一次性全部解雇,您只需要这样做。

    【讨论】:

    • 谢谢本。我想我想保留本地模型,因为它们将在许多 ViewModel 中使用。我不知道 PropertyChanged(null),这很酷。
    【解决方案2】:

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

    例如,如果您有一个 Product Model 和 ProductListViewModel,其中包含一个产品集合以及一个搜索命令,那么您将引入一个 ProductSearchService(或加载所有产品的 ProductLoadService)。然后我会将该 ProductSearchService 传递给您的 ProductListViewModel 构造函数(依赖注入),并让您的 ViewModel 通过调用相关的服务方法并加载响应来控制产品(您的模型对象)的检索。

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

    这种模式本质上类似于 Model-View-Controller,其中 ViewModel 承担了更多的 Controller 职责。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-14
      • 1970-01-01
      • 1970-01-01
      • 2011-11-07
      • 2013-11-28
      • 1970-01-01
      相关资源
      最近更新 更多