ViewModel应该如何与存储库交互?

时间:2013-10-07 14:08:48

标签: wpf data-binding mvvm repository-pattern observablecollection

我正在学习使用MVVM构建应用程序,我有以下情况:

  • ViewModel应显示Examination类型的对象列表。此列表将数据绑定到视图中的ListView,并将从中进行过滤,用户将选择ActiveExamination以供进一步使用。
  • 存储在模型层中的“存储库”应该“作为域对象的内存中集合”,并在ViewModel中实例化。

现在我的问题是:如果存储库是要将数据绑定到视图的集合,还是它应该只是实现INPC的属性的“数据源”?例如,从以下可能性来看,其中一个是正确的,另一个是错的,还是两个都错了......?

// example where the list is replaced in order to be changed;

// ViewModel class (part of it)
public class ThisViewModel : ViewModelBase {
    public List<Examination> ExaminationList {
        get { return _examinationList; }
        set { _examinationList = value;
              NotifyOfPropertyChange("ExaminationList"); }
    }
}


var repo = new ExaminationRepository();
ThisViewModel.ExaminationList = repo.getAll().where(ex => ex.Value > 20).ToList();

第二个选项

// Example where the very property IS a repository

// ViewModel class (part of it)
public class ThisViewModel : ViewModelBase {

    // the List is actually a repository in disguise.
    IEnumerable _examinationList = new ExaminationRepository();

    public List<Examination> ExaminationList {
        get { return _examinationList; }
        set { _examinationList = value;
              // This should be "NotifyOfCollectionChange", I guess...
              NotifyOfPropertyChange("ExaminationList"); }
    }
}

我很可能在这里很困惑/错误,但我的应用程序相当小而且简单的架构,我真的不打算使用我见过的与此类问题相关的大多数框架和高级概念(ORM) ,IoC,DI),而我主要关心的是“如何在WPF / MVVM数据绑定环境中正确处理可变的,基于reppository的集合”。

编辑:关于我的申请的一些背景: 该应用程序是执行临床检查的应用程序。它有一个患者列表,每个患者都有其检查。有一个Patient存储库和一个Examinations存储库。当我在PatientList中选择患者时,该患者的ExaminationsList显示来自Examinations repo的匹配Examinations。患者和检查的用户操作是CRUD,或者最具体的是BREAD(浏览,阅读,编辑,添加和删除)。

感谢您的任何建议!

1 个答案:

答案 0 :(得分:2)

在我看来,为了在大型应用程序中实现最佳分离,您应该始终使用单独的集合从数据库中填充,然后在UI中显示。这个确实意味着您必须遍历集合两次,但这仍然是WPF中常见的,因为我们希望为UI添加额外的显示属性,例如{{1} }或IsSelected(如果我们填充视图模型对象)。

真正的主要原因是允许我们在应用程序中连接各个层,以便我们可以独立测试每个层。如果你没有要求这样做,那么也许它不是那么重要。

我一直想知道为什么Microsoft在自动生成的类中实现IsFocusedINotifyPropertyChanged接口(例如来自Linq2SQL)在UI中使用这些类时直接打破了它们之间的层次分离他们自己总是告诉开发人员坚持。

更新&gt;&gt;&gt;

我想说,对于一个小型应用程序,你做这些事情的方式和地点并不重要。有时在编写一个非常小的应用程序时,我甚至不打扰使用MVVM。创建图层和/或实现MVVM文件夹结构都会增加额外的开发时间和额外的代码,我觉得它们只有 if 你才有用;

a)将分别测试您的应用程序的各个层,或

b)未来某个阶段可能需要“换出”一个或多个层,例如。例如,从INotifyPropertyChanging数据库移动到SQL数据库,或从WPF UI移动到基于Web的UI。