ASP.NET MVC:什么机制返回ViewModel对象?

时间:2010-04-08 05:59:27

标签: c# asp.net-mvc viewmodel ddd-repositories aggregateroot

据我了解,Domain Models是仅描述数据(聚合根)的类。它们是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对象,这样您就拥有了正确的数据类型。

3 个答案:

答案 0 :(得分:4)

我建议你看看CQRS(Command Query Responsibility Segregation)。基于此模式,您不需要从存储库获取模型,然后将其映射到ViewModel。

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

1-您不必担心Model和ViewModel之间的映射,因此更容易编码和维护。 2-很多时候,模型所具有的属性并不完全是用户期望在屏幕上看到的。一些开发人员仅为了显示的目的而向他们的模型添加新属性,这导致模型长期失去现实。通过直接从您的提供程序返回ViewModel或DataSet / DataTable而不依赖于您的模型,您可以允许模型和ViewModel单独进化。

MOSH

答案 1 :(得分:3)

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

答案 2 :(得分:2)

AutoMapper可用于将模型转换为视图模型。这是您在ASP.NET MVC应用程序中使用它的非常nice article

基本上你的控制器动作可能如下所示:

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

因此,您仍然可以在控制器中使用域模型,AutoMap操作过滤器将使用AutoMapper根据映射文件将模型转换为视图模型并将其传递给视图