MVVM每个层的角色

Sam*_*dam 5 c# vb.net wpf structure mvvm

首先,在经过这么长时间的斗争之后,我无法理解MVVM模式的本质,我感到很惭愧,我不禁要问.

我搜索和搜索了MVVM,但是(我似乎)清楚的层只是View和ViewModel层.

所以这是我到目前为止所掌握的一些小例子,仅供我使用MySQL查询来获取我的数据:

模型

我不清楚在这做什么.我有这类Employee.cs:

class Employee
{
    public string Id { get; set; }
    public string Name { get; set; }
    public string Gender { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

我的问题:我应该在EmployeeModel类中从MySQL数据库中获取数据吗?我读到了这个答案,数据访问层与MVVM的模型不同,而且我可以使用存储库从我的数据访问层请求Employees列表.

根据答案,那应该是这样的:

  • Employee.cs [对象属性定义],
  • EmployeeDataAccess.cs [负责从MySQL获取员工数据]
  • EmployeeRepository.cs [由EmployeeModel调用以从DA获取Employee数据]
  • EmployeeModel.cs [我处理业务逻辑,如验证等,并在与Employee.cs几乎相同的属性上使用INotifyPropertyChanged]
  • EmployeeViewModel.cs [EmployeeView的数据上下文]
  • EmployeeView.cs [XAML]

对于一页员工名单的所有这些,我做错了什么?

很抱歉,如果我说错了,我会非常乐意解决这个问题.

我现在真的很无能,所以任何新鲜的观点都非常感激.

干杯!

Pat*_*iek 6

好的,我们来看看:

  • EmployeeDataAccess.cs和EmployeeRepository.cs 可能(但不一定,如下所示)可以组合成一个类,比如说'EmployeeRepository',它可以获取数据并返回模型类.
  • 您的"EmployeeModel"实际上是一个视图模型,因此我们可以删除"EmployeeViewModel"类并将"EmployeeModel"重命名为"EmployeeViewModel".
  • 现在这一点取决于你自己的偏好,但你可以使用通用存储库而不是每个类的存储库; 在这种情况下,您将拥有一个Repository针对所有数据模型的通用CRUD方法的类.

然后你最终得到:

  • 每个数据模型类都有自己的视图模型和视图(每个实体有3个类)
  • 有一个存储库,在视图模型中调用然后映射结果,或者您可以引入另一个薄层,将在视图模型中使用它将调用存储库并为您执行映射(模型<==>视图模型)一气呵成.

不是很糟糕,是吗?:)

不要过度思考它,也不要过度使用你的解决方案.在一个简单的应用程序中有300个不同的间接层是毫无意义的IMO.如果应用程序增长并且对单独的层有合理的需求,您可以随意开发它们.

[编辑]当然,我假设"模型"类同时是一个实体类; 随着任何一种ORM,甚至轻量级的ORM(Dapper想到).