据我了解,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对象,这样您就拥有了正确的数据类型。
答案 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
根据映射文件将模型转换为视图模型并将其传递给视图