3

据我了解,域模型是仅描述数据(聚合根)的类。它们是 POCO,不引用外部库(没什么特别的)。

另一方面,视图模型是包含域模型对象以及所有接口特定对象(如SelectList. 一个 ViewModel 包括using System.Web.Mvc;.

存储库从数据库中提取数据并通过域模型对象将它们提供给我们。 什么机制或设备创建视图模型对象,从数据库中填充它们? 它会是一个可以访问数据库的工厂吗?您会将诸如 System.Web.Mvc 之类的视图特定类引入存储库吗?还有什么?

例如,如果您有一个城市下拉列表,您将在 View Model 对象的根目录中引用一个 SelectList 对象,就在您的 DomainModel 引用旁边:

public class CustomerForm {
    public CustomerAddress address {get;set;}
    public SelectList cities {get;set;}
}

城市应该来自数据库并采用选择列表对象的形式。希望您不要创建特殊的 Repository 方法来仅提取不同的城市,然后仅创建冗余的第二个 SelectList 对象,以便您拥有正确的数据类型。

4

3 回答 3

4

我建议您查看 CQRS(命令查询责任分离)。基于此模式,您实际上不需要从 Repository 获取模型然后将其映射到 ViewModel。

您可以使用一组单独的类来检索数据(查询)并在视图上显示。您可以将这些类称为 Providers 或任何您喜欢的名称。这些类可以返回 ViewModel 或通用 DataSet/DataTable 对象。这种方法有两个好处:

1-您不必担心模型和视图模型之间的映射,因此更容易编码和维护。2- 很多时候你的模型所拥有的属性并不是用户期望在屏幕上看到的。一些开发者在他们的模型中添加新的属性只是为了展示,这导致模型长期失去了它的真实性。通过直接从您的 Provider 返回 ViewModel 或 DataSet/DataTable 而不依赖于您的模型,您允许您的模型和您的视图模型分开发展。

莫什

于 2010-04-14T04:38:24.390 回答
3

我会说从域对象填充视图模型是控制器的责任。控制器“获取”操作将从存储库中检索域对象,创建视图模型,填充视图模型,然后将其传递给视图。

于 2010-04-08T06:14:37.910 回答
2

AutoMapper可用于将您的模型转换为视图模型。这是一篇非常好的文章,介绍了如何在 ASP.NET MVC 应用程序中使用它。

基本上,您的控制器操作可能如下所示:

[AutoMap(typeof(ProductModel), typeof(ProductViewModel))]
public ActionResult Index(int id)
{
    return View(_repository.GetById(id));
}

所以你仍然在控制器中使用你的域模型,AutoMap动作过滤器将AutoMapper根据映射文件将模型转换为视图模型并将其传递给视图。

于 2010-04-08T07:05:29.920 回答