2010-04-08 85 views
3

据我所知,域模型是只描述数据(聚合根)的类。他们是POCO,不参考外部图书馆(没有什么特别的)。ASP.NET MVC:什么机制返回ViewModel对象?

另一方面,查看模型是包含域模型对象的类以及所有接口特定对象(如SelectList)。 ViewModel包含using System.Web.Mvc;

存储库从数据库中提取数据并通过域模型对象将它们提供给我们。 什么机制或设备创建视图模型对象,从数据库填充它们?它会成为拥有数据库访问权限的工厂吗?你会流血视图特定类像System.Web.Mvc到仓库?还有别的吗?

举例来说,如果你有一个下拉的城市名单,你会引用的SelectList对象在你的视图模型对象的根,旁边就是你的DomainModel参考:

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

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

回答

2

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

基本上你的控制器动作可能是这样的:

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

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

+0

当你处理额外的数据时,比如填充下拉列表的内容,你是否从存储库中提取这些数据?你是否创建了特殊的领域模型来处理像“城市列表”这样的“微观”领域模型?还是有一些其他类型的模式,如具有数据库访问权限的工厂? – 2010-04-08 14:20:12

+1

Steve Michelotti发现了一篇很棒的文章:http://geekswithblogs.net/michelotti/archive/2009/10/25/asp.net-mvc-view-model-patterns.aspx – 2010-04-08 15:00:50

3

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

+0

+1 - 控制器“提出了”用正确的数据模型视图绑定到(视图模型) – 2010-04-08 07:07:27

+0

因此,您创建存储库方法提取下拉列表选项,然后在控制器创建代码改造它到ViewModel?您可能会将控制器中的代码重构为单独的方法,以便将责任计数降低,因此您可能会在控制器空间的某个地方放置一堆方法,而不是使用一些机制来容纳所有这些方法?你如何访问数据库来填充这些ViewModels?你真的有很多Repository方法,每个DDL有一个方法,返回这些微域对象,还有更多的方法来转换它们? – 2010-04-08 14:16:11

+0

在控制器空间中具有此功能是适当的。如果您有很多类似的下拉列表,那么可能会有一些机会来重构它以将它们合并到一个存储库中。 然后,为了创建视图模型,您仍然可以使用工厂或某种映射器将代码组合在一起。 将域对象转换为视图模型当然是MVC应用程序面临的挑战之一。我发现将mapper类组合在一起可以提供帮助。 – Mac 2010-04-09 09:57:43

4

我建议你看看CQRS(命令查询责任分离)。基于这种模式,您并不需要从存储库获取模型,然后将其映射到ViewModel。

您可以分配一组类来检索数据(查询)并在视图上显示。您可以调用这些类提供程序或任何您喜欢的。这些类可以返回ViewModel或通用的DataSet/DataTable对象。这种方法有两个好处:

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

MOSH