ASP.NET MVC:视图模型是否应该封装领域模型?

5
我看过很多MVC示例,其中直接将领域对象传递给视图,如果您的视图很简单,这种方式可能会很好地工作。
常见的替代方法是使用视图模型,它具有与您的领域模型相同的所有属性以及您的视图可能需要的任何其他属性(例如“confirmPassword”)。
在进行太多阅读和发现AutoMapper之前,我开始创建自己的视图模型变体,其中领域对象(或多个领域对象)仅是视图模型的属性。
我做错了吗?从这种方法中可以获得哪些问题或好处? 在什么情况下,这种做法可能很有效?

如果您正在封装领域模型,那么ViewModel的目的是什么? - Omu
主要原因是为了聚合多个领域模型,例如:产品、购物篮、导航等。 - Myster
2个回答

4

直接将领域模型暴露给视图并没有什么本质的坏处。主要风险在于意外暴露某个属性,比如将员工对象的薪资字段暴露出来。如果返回JSON,请务必注意这一点。

还有一件需要注意的事情是从编辑表单绑定回来时。你应该了解涉及的具体 风险。基本上,恶意用户可以添加与您不想可编辑的字段匹配的字段到POST中。我总是绑定到一个中间对象,然后将其传递到服务中再映射回领域。


这仅适用于作为操作参数的域对象;将它们传递给视图并不会存在任何不安全的问题。 - queen3
我记得有人主张viewModel应该与postbacks的Action参数是相同类型。这种方法似乎意味着你必须完全分离你的领域模型。(除非它打算完全开放修改) - Myster
我发现使用DDD方法,其中我使用我的工厂来实例化我的模型对象(这些对象被传递到我的视图),我避免了您提到的POST表单集合的特定问题 - 我需要自定义模型绑定器,以便我的工厂了解如何创建对象,从而强制执行始终有效和安全的领域模型对象实例。 - Matt Kocaj
这里有一个非常简单的示例,展示我们如何进行操作。 http://gist.github.com/844100 我们使用更新模型的原因是因为我们通常只修改聚合的一小部分。仅在初始创建领域实体时使用工厂(仅当我们无法使用静态创建方法时)。 - Ryan
@Ryan 你在你的gist做什么。在你的repository接口中,对CRUD-Get方法进行了示例,但是.Update你使用了交易领域对象。 - Pascal
显示剩余2条评论

0

不太好?不能使用Automapper。 ;)

很好?我脑海中没有任何想法。

我认为你并没有做什么可怕的事情。它对你有用吗?如果有,为什么不呢?


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接