【问题标题】:Is Microsoft's MVC implementation different from classic MVC pattern [closed]微软的 MVC 实现与经典 MVC 模式不同吗?
【发布时间】:2016-02-16 15:09:41
【问题描述】:

在网上关于 ASP.NET MVC 的各种文章中,有人提到微软的 MVC 实现与“经典”MVC 模式有所不同。

但我从未见过任何人对此进行详细介绍,乍一看,我看不出 ASP.NET MVC 与所描述的内容有何不同,例如 here

所以我的问题是:ASP.NET MVC 真的违反任何 MVC 模式原则吗?

【问题讨论】:

  • 您能描述一下您认为 ASP.NET MVC 的哪些部分不符合 MVC 设计原则吗?否则,恐怕这会变得非常基于意见。或者把问题反过来,比如“ASP.NET MVC 是否实现了模型-视图-控制器设计模式的核心原则?”。甚至更适用于全球:“HTTP 应用程序是否可以正确实现 MVC 设计模式中的 X、Y 和 Z 原则?”.
  • @CodeCaster,我的问题是我不认为 ASP.NET MVC 的任何部分违反了 MVC 设计原则。我的目的是找出其他人认为哪些部分违反了这一原则。
  • “其他人的想法” - 是的,所以它是基于意见的。
  • 可能,但我发现许多 SO 问题有点基于意见但仍然有用:“X 的最佳实践是什么?”、“正确的方式使用技术Y“等处理错误。
  • 撇开这些问题不谈,我提供了一些提示,让您可以用不同的措辞来表达您的问题,这样您可能会得到更多答案,或者更好地回答您的实际问题的答案,而不是让您的问题结束,但无论您的问题如何。

标签: asp.net-mvc design-patterns model-view-controller


【解决方案1】:

问题实际上在于 MVC 是一种松散定义的模式。 “M”可以解释为“业务领域中的一切,从实体到业务逻辑”。

我不会说 ASP.NET 违反 MVC,而是松散地解释它。

一些官方 MVC 示例直接在控制器中使用实体框架,我认为这是不正确的。因为那样它就不能充当模型和视图之间的桥梁。相反,它负责业务逻辑(即使它是非常基本的逻辑)并将模型信息映射到视图。

ASP.NET MVC 有一些称为视图模型的东西,它不是 MVC 中的 M。相反,它们被用作模型(或者更确切地说是模型中的多个实体之一)和视图之间的适配器,从而接管了控制器的部分职责。

【讨论】:

  • 我总是将“M”解释为视图模型,因为 MVC 是一种 UI 技术。业务逻辑可以在单独的层、Web 服务,甚至在数据库中。
  • @Ryan:来自维基百科:The central component of MVC, the model, captures the behavior of the application in terms of its problem domain, independent of the user interface
  • “直接在控制器中的实体框架在我看来是不正确的” - 没错!域在哪里?如果我明天不想使用 EF 怎么办?所以,我们重复同样的错误。我们有控制器,而不是作为中介或桥梁,现在是 BLL 和 DA
  • hmm...但是如果我们不使用MVC中的视图模型,控制器如何调整问题域对象以适应视图?
【解决方案2】:

通常是的,微软对 MVC 模式的实现遵循 MVC 模式的主要租户。它有一个模型、控制器和视图负责 UI 的稍微不同的方面(请记住,MVC 在这种情况下是一种表示模式,因此它只负责 UI(大部分))

微软开始偏离的地方是引入了一些不太干净(如不是 100% MVC)的功能,特别是

上述某些内容比其他内容更具争议性。归根结底,所有这些东西都是为了加快开发速度而设计的,但要摒弃控制器构建模型然后视图呈现的想法(句号)。

Microsoft 也倾向于将 MVC 解释为一种业务逻辑模式(如上所述,它是一种 UI 模式)。

因此,在 Microsoft 世界中,您经常看到控制器从(例如)Entity Framework 获取模型的示例执行一些业务逻辑(业务逻辑不应该真正在控制器中)然后将其传递给 ViewModel(不是真的100% MVC)然后视图渲染它(使用辅助函数操作数据)。

因此,他们尝试将 MVC 作为一种适合所有解决方案的单一模式进行销售。

【讨论】:

    【解决方案3】:

    虽然,[在某些方面]我同意其他答案,但让我换个角度来看。

    ASP.NET MVC 不是一种模式,而是一个框架,您可以在其中使用 MVC 模式编写您的软件,或者更确切地说是它的特定的网络应用程序版本。

    您不必担心 Microsoft 的实施。他们对 MVC 框架的实现与 MVC 模式几乎没有关系。我敢肯定,为了实现它,MS 使用了许多不同的模式。这里的关键是要了解 MVC 框架不是 MVC。它允许您使用 MVC 模式进行开发。在这种情况下,此模式包括您需要遵循的某些规则,就像在其他模式中一样 - 例如,名称控制器以 Controller 结尾。但这是 MS 为您实现的。所以,你有视图、模型和控制器。 MVC 框架告诉您,遵守规则,我们将为您连接所有这些。

    现在,如果您将 MVC 模式作为原始模式使用,它会告诉您所有信息 - 将视图与控制器和模型分开。并将模型与控制器分开。因为这样,您可以重用具有不同视图的模型和控制器,例如。现在,你如何实现它——这取决于你。只要有我上面描述的特性,这就是MVC。所以,再次,MS 给了你 MVC 框架,在其中你有单独的 M-V-C。因此,当您编写 M、V 和 C 时,您就有了原始模式描述的分离。 MVC 框架会为您处理布线。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-03-23
      • 2013-09-01
      • 2016-09-30
      • 1970-01-01
      • 2020-08-16
      • 2010-10-13
      • 1970-01-01
      • 2011-05-05
      相关资源
      最近更新 更多