每个层的MVVM角色

本文关键字:MVVM 角色 | 更新日期: 2023-09-27 17:58:13

首先,我为自己在经历了这么长时间的斗争后未能抓住MVVM patern的精髓而感到羞愧,我忍不住要问。

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

因此,到目前为止,我一直在掌握一些小例子,仅供参考,我正在使用MySQL查询来获取数据:

型号

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

class Employee
{
    public string Id { get; set; }
    public string Name { get; set; }
    public string Gender { get; set; }
}

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

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

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

对于一页的员工名单,我是不是做错了什么?

很抱歉问了这么长的问题,如果我说错了,我会非常高兴地解决它。

我现在真的很无知,所以任何新的观点都会受到极大的赞赏。

每个层的MVVM角色

好吧,让我们来看看:

  • EmployeeDataAccess.cs和EmployeeRepository.cs可能(但不一定,请看下面)可以组合成一个类,比如"EmployeeSepository",它获取数据并返回模型类
  • 您的"EmployeeModel"实际上是一个视图模型,因此我们可以删除"EmploloyeeViewModel"类,并将"Employer model"重命名为"Employe ViewModel"
  • 现在,这一点取决于您自己的偏好,但您可以选择通用存储库,而不是每个类的存储库;在这种情况下,您将拥有一个Repository类,该类具有用于所有数据模型的通用CRUD方法

然后你会得到:

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

还不错吧?:)

不要想得太多,也不要过度设计你的解决方案。在一个简单的应用程序中拥有三百个不同的间接层是毫无意义的。如果应用程序不断增长,并且有理由需要单独的层,则可以边走边开发它们。

[EDIT]当然,我假设"模型"类同时也是一个实体类;这是任何一种ORM都附带的,即使是轻量级的(Dapper突然想到)。

好吧,你基本上涵盖了它。通常情况下,我会将N层模型与MVVM一起使用,因此在您的情况下,它将是:

  • PersonOverview(xaml)
  • PersonOverviewViewModel(用于Person Overview的视图模型)
  • BcPerson(如果需要,BLL包含业务逻辑)
  • PersonRepository(DAL与数据库通信)

还有一个DOMAIN层,它将包含person类。在那里,您可以对所有属性使用NotifyPropertyChanged。

我同意这是很多文件,但它们是有目的的。当您想要更改一个层(例如,从MySQL迁移到MSSQL)时,它们用于更好的可维护性、良好的关注点分离和灵活性。

此外,还可以生成许多管道,例如使用OR映射器。

文件

  • 存储库[获取数据]
  • Employee[包含Name等数据]
  • EmployeeVM[包含您的"Emploee"模式]
  • EmployeeListVM[继承自ListVM]
  • ListVM[列表的基本视图模式]
  • EmployeeListV[您的观点]

样品:

  • 按下了一些按钮
  • 调用EmployeeListVM构造函数
  • 请求RepositorygetAllEmployee()得到一个List<EmployeeVM>
  • 现在,它将其附加到ListVM属性"ItemList"

    现在您只需要显示您的视图和bin EmployeeListV.DatacontextEmployeeListVM