ASP.NET MVC:ViewModels与域实体

时间:2011-03-09 16:22:06

标签: asp.net-mvc

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

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

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

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

6 个答案:

答案 0 :(得分:15)

  

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

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

答案 1 :(得分:7)

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

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

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

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

答案 2 :(得分:7)

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

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

答案 3 :(得分:1)

域模型和ViewModel看起来非常相似。但是,ViewModels通常包含视图逻辑属性和属性。有时数据类型也可能不同,例如,您可能需要将DateTime属性定义为字符串,只需使验证工作而不会引发任何错误。

我正在使用AutoMapper将模型转换为ViewModels /反之亦然。

答案 4 :(得分:1)

ViewModel很好但不要忘记Validation属性不仅限于MVC项目,您可以在任何.net项目中使用它们。因此,将验证属性应用于域对象是有意义的,最好是使用部分类和/或Validator类http://weblogs.asp.net/scottgu/archive/2010/12/10/class-level-model-validation-with-ef-code-first-and-asp-net-mvc-3.aspx

答案 5 :(得分:1)

我的方法是ViewModel模型应该与单个视图(或至少一组相关视图)相关联,并且通常是域模型的子集。我看到一个ViewModel负责UI验证,你的域对象负责业务规则验证。

至于两者之间的映射,强烈建议使用可以根据约定自动映射属性的Automapper,这可以节省大量时间。