ASP.NET MVC:ViewModels与域实体

Chr*_*ris 11 asp.net-mvc

我正在用MVC 3构建一个概念应用程序,试图了解它的方法.我以前在WebForms中使用n层方法完成了一些非常重要的应用程序,通常由存储的存储库和服务的域对象组成,以便在存储之前对它们进行操作.

我试图调和我以前用"正确"方式做事的方式在MVC中做这些事情,如果有这样的话.我现在要挂起的东西是何时使用ViewModels与何时使用我在其他项目中的域对象.验证是通过ViewModels完成的,但是当我编写更多自定义的业务逻辑验证时,似乎它对于一个低级的ViewModel负有太大的责任,它只是帮助我移动数据,然后通过存储库层将其正式存储在数据库中.

我也厌倦了将ViewModel数据映射到存储库存储和检索的"官方"域对象,但我觉得我不应该使用MVC属性来破坏我的域对象以进行验证.

对于在域对象和纯粹的ViewModel之间绘制线的位置,您有什么建议吗?或者我是否使事情变得复杂,我的ViewModel实际上应该是存储库存储的"官方"模型?

Dar*_*rov 15

对于在域对象和纯粹的ViewModel之间绘制线的位置,您有什么建议吗?

我个人总是使用View Models.所有UI验证逻辑都在视图模型(必填字段,...)和域模型上的业务逻辑(用户名已存在,...)上完成.我还使用AutoMapper,以免厌倦了域模型和传递给视图的视图模型之间的映射.

  • @Omar,在我正在开发的应用程序中,可能会发生视图模型是其域对象的精确副本,但这种情况极为罕见.我通常在我的视图模型上有Display属性,它们将格式化正在显示的标签,对它们进行本地化,生​​成正确的小数格式,... (3认同)
  • @Brian Ball - 我不同意 - 如果要显示数据绑定问题,视图模型允许你进行字符串化,这使得视图中的代码变得简单. (2认同)

Rob*_*est 7

我认为最好的方法是始终使用视图模型.这些是关于表示问题,应该是处理基本输入验证的地方.域对象不适合这种情况.

我在每个视图中使用特定的视图模型,并且只包含视图中所需的信息 - 保持视图模型完全以视图为中心,使得视图更加干净.

您可以使用Automapper帮助消除在视图和域模型之间移动的苦差事.

我可以推荐ASP.NET MVC 2 in Action作为强大的ASP.NET MVC模式的好书.这包括详细使用Automapper.


Bri*_*all 7

我通常默认使用View Models,但是对于只读视图,我已经知道使用域模型(如果我只想从中读取数据,没有理由经历映射的开销).

如果您决定使用域模型,我永远不会让MVC直接绑定到它们,因为如果有人足够了解您的域,他们可以发布绑定到您不希望用户能够编辑的属性的值.您可以定义粘合剂可以和不能绑定的属性的白色和黑色列表,但是利用它是您必须维护的其他东西以及容易被遗忘的东西.