每个层的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]
对于一页的员工名单,我是不是做错了什么?
很抱歉问了这么长的问题,如果我说错了,我会非常高兴地解决它。
我现在真的很无知,所以任何新的观点都会受到极大的赞赏。
好吧,让我们来看看:
- 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
构造函数 - 请求
Repository
到getAllEmployee()
得到一个List<EmployeeVM>
-
现在,它将其附加到ListVM属性"ItemList"
现在您只需要显示您的视图和bin
EmployeeListV.Datacontext
和EmployeeListVM