2013-03-21 67 views
0

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

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

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

我的问题是,什么是一个很好的设计模式,使用从webservice调用返回的json必须用于填充模型?

回答

1

看来你的初始尝试已经打破了'single responsibility principle',并导致了非常混乱的DataStore类。

我对viewmodel数据操作的实现是保存'ViewModelPopulator'类的集合。每个服务填充的viewmodel都有一个对viewmodelpopulator的引用,这个viewmodelpopor负责保存viewmodels属性。

为了促进代码重用可能的是,单个视图模型可以由不同populators填充因此参考(例如,一个“CarCollectionViewModel”由任一“HondaCollectionViewModelPopulator”或“KiaCollectionViewModelPopulator”填充)实际上是一IViewModelPopulator<T>其中T是要填充的视图模型。

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

此外,这允许您在设计时(在下面的示例中)声明性地从UI层将注释添加到视图模型中,或者在运行时在代码隐藏中分配它们。

<Page.DataContext> 
    <VM:SearchPageViewModel> 
     <VM:SearchPageViewModel.ViewModelPopulator> 
      <VMP:SearchPageViewModelPopulator /> 
     </VM:SearchPageViewModel.ViewModelPopulator> 
    </VM:SearchPageViewModel> 
</Page.DataContext>