5

首先很惭愧自己经过这么长时间的奋斗,还是没能掌握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 数据库中获取数据吗?我读到这个答案,数据访问层与 MVVM 的模型不同,而且我可以使用存储库从我的数据访问层请求员工列表。

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

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

所有这些都是为了一页员工列表,我做错了吗?

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

我现在真的一无所知,所以非常感谢任何新的观点。

4

3 回答 3

6

好,我们来看看:

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

然后你最终得到:

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

没那么糟糕,是吗?:)

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

[编辑] 当然,我假设“模型”类同时是一个实体类;任何类型的 ORM,甚至是轻量级的 ORM(Dapper 都会想到)。

于 2013-02-08T10:44:40.280 回答
1

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

  • 人物概览 (xaml)
  • PersonOverviewViewModel(人物概览的视图模型)
  • BcPerson(必要时 BLL 包含业务逻辑)
  • PersonRepository(DAL 与数据库通信)

还有一个 DOMAIN 层女巫将包含 person 类。在那里,您将在所有属性上使用 NotifyPropertyChanged。

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

例如,通过使用 OR 映射器,还可以生成大量管道。

于 2013-02-08T10:46:45.993 回答
0

文件

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

样本:

  • 按下了一些按钮
  • EmployeeListVM构造函数被调用
  • Repository得到getAllEmployee()一个List<EmployeeVM>
  • 现在它把它交给 ListVM 属性“ItemList”

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

于 2013-02-08T11:12:46.270 回答