MVVM每个层的角色

时间:2013-02-08 10:33:16

标签: c# wpf vb.net mvvm structure

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

我搜索并搜索了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数据库中获取数据吗?我读到了这个answer数据访问层与MVVM模型不同的东西,而且我可以使用存储库从我的数据访问层请求一个Employees列表。

基于该答案,它应该是:

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

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

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

此刻我真的很无能,所以非常感谢任何新鲜的观点。

干杯!

3 个答案:

答案 0 :(得分:5)

好的,我们来看看:

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

然后你最终得到:

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

不是很糟糕,是吗? :)

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

[编辑]当然,我假设“模型”类同时是一个实体类;随着任何一种ORM,即使是轻量级的ORM(Dapper会让人想到)。

答案 1 :(得分:1)

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

  • PersonOverview(xaml)
  • PersonOVerviewViewModel(人物概述的视图模型)
  • BcPerson(BLL包含业务逻辑,如果nessecary)
  • PersonRepository(DAL与数据库通信)

还有一个DOMAIN图层将包含person类。你可以在所有属性上使用NotifyPropertyChanged。

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

例如,使用OR映射器也可以生成很多管道。

答案 2 :(得分:0)

文件

  • 存储库[获取数据]
  • 员工[包含姓名等数据]
  • EmployeeVM [包含您的“Emploee”模型]
  • EmployeeListVM [继承自ListVM]
  • ListVM [列表的基本ViewModle]
  • EmployeeListV [您的观点]

样品:

  • 按下了一些按钮
  • EmployeeListVM构造函数被称为
  • 要求Repository getAllEmployee()获得List<EmployeeVM>
  • 现在它将其改为ListVM属性“ItemList”

    现在您只需要显示您的视图并将EmployeeListV.DatacontextEmployeeListVM