5

我的桌面 WPF 应用程序有一个存储库(类型为Person),它位于模型层中,并由一个 ViewModel 调用,该 ViewModel 具有一个PersonList数据绑定到DataGrid.

当我打开我的应用程序时,默认情况下会显示该列表。在初始化期间,以下代码适用:

public class PersonScreenViewModel : ViewModelBase
{
    PersonRepository _person_repository;

    public ObservableCollection<Person> PersonList { get; set; }

    public PersonScreenViewModel() {

        _repositorio_pacientes = new RepositorioPacientes();

        PersonList = new ObservableCollection<Person>(_person_repository.GetAll());
    }

    // ... ///
}

我的怀疑是基于一些难以理解如何实现“保存/更新”方法的。

每个关于存储库模式的文本都告诉我们“存储库的行为应该像 [实体 | 域对象] 的集合”。因此,最合乎逻辑的做法是将存储库本身数据绑定到DataGrid. ObservableCollection如果我创建了一个继承并实现存储库逻辑的类,则可以做到这一点。目前,我所做的是使用 获取存储库项目的副本_repo.GetAll(),并在该副本中工作,在我的更改完成后必须提交回来。

具体来说,我的工作流程涉及在 DataGrid 中选择一行,更改所选对象的某些属性,并提交这些更改,并期望相同的对象与新的属性值一起保留。

通常,如果您在集合中获取一个对象并对其进行修改,则不需要“更新”任何内容,因为您已经更改了对象本身。

问题是:“我如何将我的视图数据绑定到存储库本身?存储库是否应该继承自ObservableCollection?它应该如何完成?我的推理的某些部分有缺陷吗?”

重要的是要说我的应用程序不是面向数据的,Person类是非常基本的(POCO 标记为[Serializable],具有一些属性),并且我的存储库使用纯 XML 序列化和文件系统结构。

谢谢阅读!

4

2 回答 2

2

在我个人看来,您当前所做的事情是正确的……在应用程序的各个层之间进行一些分离通常是一种很好的做法;模型、视图模型、视图和数据访问(有时合并为模型)。话虽如此,这实际上取决于您的应用程序......在小型应用程序上这样做可能不值得,因为它会增加大量代码和时间来设置和维护。

但是,提供这种分离(称为关注点分离)的主要原因是使单元测试能够在不涉及其他层的情况下测试各个层。例如,如果我们想为我们的视图模型编写单元测试,我们不希望在数据库中的实际数据对象上测试它们的功能。如果我们有这种分离(通过使用接口),那么我们可以简单地模拟数据对象以在这些测试期间使用。

另一个原因,虽然在实践中不太常见,但可以让整个层“换出”而不影响其他层中的代码。这方面的示例包括更改应用程序中使用的数据库,或者可能将视图从桌面应用程序更改为 Web 应用程序中的网页。如果我们有单独的层,那么这些更改不会影响其他层。

因此,要直接回答您的问题,我根本不会将您的观点绑定到存储库......保持您当前的分离。毕竟,将来自数据库的集合复制到视图集合属性中需要多长时间?

更新>>>

我不确定我是否完全理解您评论中的问题。我猜您正在PersonList将视图模型中的属性绑定到DataGrid.ItemsSource属性以显示数据。中所做的任何更改DataGrid都会影响PersonList. 如果要添加 'Save' Button,则可以在该单击或命令处理程序中更新数据库。

如果您正在询问如何找出哪些元素已被更改,有几种方法可以完成此操作。How to get only modified Items from WPF Data Grid post here中有一个很好的提示,但我更喜欢使用重复的集合并比较它们以找到更改的元素(您需要实现该Equals方法才能工作)。

如果这不能回答您的问题,请告诉我。

于 2013-10-16T14:17:48.510 回答
2

“每个关于存储库模式的文本都告诉我们,”存储库应该表现得像一个 [entities | 域对象”。

你最初拥有的东西是正确的。首先,ObservableCollection 与 View 完美配合,因为每次添加/更新/删除都会自动传播回用户界面。如果您使用存储库实现它,那么您将不得不调用数据库重新加载绑定到存储库的控件

“我如何将我的视图数据绑定到存储库本身?存储库是否应该从 ObservableCollection 继承?应该如何完成?我的推理的某些部分是否有缺陷?“

  • 您不想将 Repository 数据绑定到 DataGrid 本身,因为您会丢失缓存,并且每次用户加载用户控件时,您总是要返回数据库。
  • 您不想将存储库继承到 ObservableCollection,因为ObservableCollection 与简单的 IEnumerable 相比具有更多开销,因为您已经数据库返回了一个集合。
  • 您总是不希望 ObservableCollection 作为您的数据集合,因为它很昂贵。根据您的方案(只读数据),一个简单的数据枚举就足够了。
于 2013-10-16T14:21:03.137 回答