0

我目前正在构建一个 Windows 8 应用商店应用程序,该应用程序需要我进行多个 Web 服务调用。这些调用返回一个我正在反序列化为对象的 json 字符串。我将 MVVM 设计模式与 Caliburn.Micro 一起用于 WinRT。

最初,为了从对我的每个视图模型的 Web 服务调用中获取数据,我创建了一个类 DataStore,它声明了它自身的一个静态实例。该类具有与我的所有模型相对应的属性。当需要进行 Web 服务调用时,我在“APIData”中调用了一个静态类方法,该方法读取参数字典,将这些参数序列化为 JSON,进行 API 调用并将 JSON 结果返回给 DataStore 类。此时 JSON 被反序列化并用于更新 DataStore 属性。在我的每个 ViewModel 中,我引用了该 VM 的数据上下文所需的任何 DataStore 属性。

这导致重复的代码和非常混乱的 DataStore 类。

我的问题是,在必须使用从 web 服务调用返回的 json 来填充模型的情况下,什么是一个好的设计模式?

4

1 回答 1

1

您最初的尝试似乎违反了“单一职责原则”,这导致了非常混乱的 DataStore 类。

我对视图模型数据操作的实现是保存“ViewModelPopulator”类的集合。每个服务填充的视图模型都包含对视图模型填充器的引用,该视图模型填充器的职责是水合视图模型属性。

为了促进代码重用,单个视图模型可能由不同的填充器填充(例如,一个 ' CarCollectionViewModel' 由一个 'HondaCollectionViewModelPopulator ' 或一个 ' KiaCollectionViewModelPopulator' 填充)因此引用实际上是一个IViewModelPopulator<T>其中 T 是要填充的视图模型.

这导致视图模型和数据访问层之间的松散耦合。在您的示例中,我会将 Json 反序列化(可能通过一些辅助方法)放在 viewmodelpopulator 类中。

此外,这允许您在设计时从 UI 层以声明方式将填充器注入到视图模型中(如下例所示),或者在运行时在代码隐藏中分配它们。

<Page.DataContext>
    <VM:SearchPageViewModel>
        <VM:SearchPageViewModel.ViewModelPopulator>
            <VMP:SearchPageViewModelPopulator />
        </VM:SearchPageViewModel.ViewModelPopulator>
    </VM:SearchPageViewModel>
</Page.DataContext>
于 2013-03-21T12:32:16.660 回答