4

我是 MVC 的新手。

我已经阅读了这篇简短的文章,详细介绍了在 MVC 中处理视图模型的三种方法:

http://geekswithblogs.net/michelotti/archive/2009/10/25/asp.net-mvc-view-model-patterns.aspx

在我看来,它的要点是:

方法 1,从数据库中拉出一个对象并将其用作您的视图模型。快速而简单,但是如果您想要来自多个表的数据,那么您完全搞砸了(如果没有方法 2,我想不出办法)。

方法 2,创建一个引用多个对象的类,并将其用作您的视图模型。这样您就可以访问所需的一切。文章说,当视图变得复杂时,它会由于域/视图模型对象之间的阻抗不匹配而崩溃……我不明白这是什么意思。谷歌搜索阻抗不匹配返回了很多东西,其要点是您使用对象来表示数据库内容,而内容并没有干净地映射,但即使使用方法 1,您也可能会遇到这个问题。不确定我是什么失踪。在我看来,从维护的角度来看,为每个视图创建一个类以获取所需的数据并不理想,不确定您是否有选择。

方法 3,我仍然对它有所了解,但我不太明白为什么他们的复选框示例在方法 2 中不起作用,如果您在未连接到域模型的类中添加了 bool addAdditional。方法 3 似乎是说而不是直接返回域的东西,只是拉出你特别需要的属性,我认为这更好,但会更难维护,因为你需要一些大型构造函数this.x = domain.xthis.y = domain.y等等。

我不了解构建器,特别是为什么使用该界面,但会继续努力。

编辑:我刚刚意识到这不是一个真正的问题,我的问题是,我的想法是否正确?

4

2 回答 2

1

我遇到的问题 #2 是我必须做以下两件事之一:

  • 在表单上的每个对象上包含每个字段——那些不会显示的字段需要包含但隐藏。

  • 只包括我需要的特定字段,但使用 AutoMapper 或类似的东西将这些字段映射回实际对象。

所以对于#2,我看到我想做的事情和我需要做的事情之间不匹配。如果我们继续进行#3,则此不匹配将被删除(据我了解,简要浏览一下)。它还解决了当使用方法 #2 时,一个坚定的黑客可以提交像 id 字段或类似的值的问题,除非我非常小心,否则可能会被写入我的数据存储。换句话说,除非非常小心,否则可以更新任何对象上的任何内容。

使用方法#3,您可以使用 AutoMapper 或类似方法来完成将自定义对象映射到数据存储对象的繁琐工作,而无需担心方法#2 暴露的安全问题/阻抗(有关#2 安全问题的更多详细信息,请参见评论)。

于 2011-09-21T14:52:31.903 回答
0

您可能对方法 1 和 2 中都存在阻抗不匹配是正确的 - 它显示在您在代码中的对象和具有关系映射的 DB 对象之间的任何地方。 Jeff Atwood撰写了关于它的文章,并引用了这篇文章,这是对所有涉及对象-关系映射或“计算机科学的越南”的精彩讨论。您最终要做的就是权衡所有这些方法的利弊,然后选择听起来最适合您需求的一种,然后意识到您选择了错误的一种。或者,也许你比我幸运,并且可以在第一轮中做对。无论哪种方式,这都是一个棘手的问题。

于 2011-09-21T14:59:32.030 回答