何时不在 Web 应用程序中使用 MVC?

Posted

技术标签:

【中文标题】何时不在 Web 应用程序中使用 MVC?【英文标题】:When NOT to use MVC in a Web Application? 【发布时间】:2010-12-04 15:38:54 【问题描述】:

我正在为一个新项目草拟一些想法,并意识到我很难以我喜欢的方式将东西融入 MVC 框架(在本例中为 CodeIgniter)。虽然我相信这可以通过更多地使用设计并找出更好的布局来克服,但它让我思考:MVC 不是可以成为最好的答案吗?如果不是,什么时候对项目使用 MVC 是个好主意,什么时候不是?

我觉得 MVC 可以用于任何网络应用程序,但我想知道什么时候它不是最好的解决方案。

【问题讨论】:

【参考方案1】:

我认为 MVC 几乎普遍适用于我们今天看到的 Web 应用程序。但这并不意味着您使用的框架总是能够支持您想做的事情的类型。

MVC 只是一种适用于 Web 的模式。特别是它非常适用于以下列方式访问应用程序的想法:

用户请求一些资源 从某处检索到一些基础数据。 然后将模板应用于该数据以便向用户显示。

不可否认,这是 Web 的工作方式,但是大多数 Web MVC 框架都假设每个用户一次产生相对较少的请求来请求大量资源。我发现随着网站的频繁移动和更小的 AJAX 样式请求,许多框架需要一些工作才能让它们很好地发挥作用,因为越来越多的 MVC 的“视图”部分需要在客户端上处理。对此的框架支持远没有服务器端视图那么成熟。但是中心范式并没有太大变化,中心的请求-查询-模板循环仍然存在。

简而言之:MVC 是一种思考应用程序工作方式的好方法,但这并不意味着您会找到一个预先编写好的框架来满足您的所有需求。

【讨论】:

【参考方案2】:

MVC 的价值在...时会迅速消失

    单个开发人员或小团队使用相同的编码语言工作的项目 具有单一界面的项目(例如,只有桌面版本) 具有丰富 UI、主要在客户端的代码以及一系列 AJAX 调用的项目 任何不是网站的东西(例如数据馈送、实用程序等) 团队成员不关心简历中是否包含“MVC”的任何项目 大约 5 年后 MVC 开始过时的任何项目

【讨论】:

这些只是纯粹的意见,还是我在这里看不到任何论据? 坦率地说,至少第 6 个论点更像是一个论点而不是一个事实,因为它已经 7 年了,MVC 仍在应用中。【参考方案3】:

当它是single page application。

(实际上,分离关注点并在小范围内进行 MVC 仍然值得,但它不是 php 服务器意义上的 MVC)

【讨论】:

【参考方案4】:

我最近一直在想同样的事情。我敢肯定,除了它是一个简单且非常小的应用程序之外,还有一个明显的答案,而 MVC 将是矫枉过正的。对我来说,展示与业务逻辑的分离似乎是一种最佳实践。

【讨论】:

表示与业务逻辑的分离也可以在没有 MVC 的情况下实现。但也许这就是你的意思。【参考方案5】:

以下是一些更适合two-tier 或three-tier 架构的应用程序:

链接聚合器 短链接生成器 虚拟主机管理面板 Web IDE 网页图片转换器 打印机前端 PDF 生成器 聊天应用 版本控制系统

以下是 Model=>View=>Controller 的其他一些替代方案:

    Two-Tier Architecture

    Three-Tier Architecture

    Four-Tier Architecture

    Hexagonal Architecture

    Pattern Oriented Software Architecture

    Understanding Patterns for System-of-Sytems Integration (pdf)

    Presentation-Abstraction-Control

    Microkernel

    Pipe-and-Filter

    Peer-to-Peer

    Modular Kernel

    Hybrid Kernel

    Monolithic Kernel

    Exokernel

参考文献

Orientation to Oracle Programmatic Environments (pdf)

Overview of Developing an Oracle Database Application

Moving Client/Server to the Web

Microsoft Patterns and Practices: Distributed Systems Patterns

Microsoft Application Architecture Guide, 2nd Edition

Tiered Distribution

【讨论】:

【参考方案6】:

基本上,当您的应用程序需要分离数据(模型)、数据处理(控制器)和数据表示(视图)时,MVC 会很好地发挥作用。这也适用于数据源和/或数据表示可以随时更改的应用程序。因此数据可以来自数据库、RSS 提要、twitter API 等,并且可以以 RSS 提要、普通 Xhtml、移动版本等形式呈现。通过将应用程序分成三层,您可以针对所有这些进行开发只需创建相应的视图或模型即可实现不同的场景。

大多数时候,网站/应用程序在某种程度上自然地适合这种模式;部分也是因为该模式最近很流行,有些人只是不假思索地使用它。

我真的不认为这是对“什么时候不是个好主意”的直接回答。我会说,当您的应用程序不能自然/容易地接缝以适应这个想法时。如果您必须真正将其投入这个想法,开始更改/添加/删除事物以使其作为 MVC 工作,那么现在不是时候了。请记住,MVC 是一种设计模式,因此它是针对特定情况的可能解决方案。对于其他可能更适合您的应用程序的情况,还有其他设计模式。这是一个link 到一些介绍设计模式的好文章,然后是一些基本的。

【讨论】:

【参考方案7】:

编辑: 我在回答问题后才注意到 PHP 标记,但是,阅读 cmets,因为原始问题提问者发现该链接很有用,所以我将把这个答案留在这里。

Jeffery Palermo(ASP.NET MVC In Action 的作者之一)有一篇博文讨论了这件事:

You should NOT use ASP.NET MVC if. . .

他说你不应该使用 ASP.NET MVC,如果:

你对多态性不太满意 您不愿意在框架之上构建 很多 UI 都依赖于第三方供应商控件 您不喜欢使用开源库

我认为该列表中最大的“阻碍因素”可能是依赖于与 MVC 框架配合不佳的 3rd 方控件(尤其是 GridView 替换等)(即,控件在内部使用 Viewstate和/或回传)。您很可能在一家公司工作,该公司要求使用某些 3rd 方控件来处理 Web 组件的特定功能(最明显的是 GridView 或日历样式的控件)而不是“内置”ASP提供类似功能的 .NET 控件。事实上,许多更复杂的基于 ASP.NET WebForms 的内置控件不能很好地与 MVC 模型配合使用,因为它们依赖于视图状态/回发以及其他不受支持的 MVC 模型功能。

此外,如果您正在构建的 ASP.NET 应用程序非常小并且非常专注于一个功能,那么使用更“传统”的 WebForms 平台而不是 MVC 可能会更快地开发任何更大的应用程序(即可能大多数商业/企业应用程序)MVC 可能是更好的选择,因为它允许对生成的代码进行更高的可测试性并促进更好的关注点分离。

【讨论】:

它不是一个 ASP.NET 应用程序,它是使用 CodeIgniter 用 PHP 编写的。但是,我觉得这是一个与语言无关的问题,而且那篇博文仍然很有趣。 鉴于最初的问题是关于 PHP 和 CodeIgniter(一个 PHP MVC 框架)——而且 PHP 在任何情况下都不支持多态性本身——我是不确定这是否真的能回答任何问题。 对不起各位!输入我的答案时太激动了,我没有注意到 PHP 标记! (Doh!)不过,我将把这个答案留在这里,只是为了博客文章链接,因为到目前为止至少有一个人发现它很有用!【参考方案8】:

老实说,我想不出任何不建议使用 MVC 方法的场景。这只是一个概念——一种以逻辑和标准化的方式将代码的明显不同部分分开的方法。

Codeigniter 是一个优秀的 框架。我已经用过好几次了。 IMO 最好的一点是,您不必遵守其他一些框架让您遵守的严格规则。 Codeigniter 为您提供了一种让您的代码井井有条、高效且安全的方法,但老实说,您可以在其中编写任何您喜欢的代码。

您能否再解释一下您所说的意思:

"...并意识到我有一些 难以适应 一个 MVC 框架”

我真的很想帮助您做出正确的决定。现在,在我看来,放弃 Codeigniter 似乎是一个糟糕的决定,因为它是基于对它的用途的无辜误解。

【讨论】:

以上是关于何时不在 Web 应用程序中使用 MVC?的主要内容,如果未能解决你的问题,请参考以下文章

何时在 MVC4 应用程序中使用 DTO(数据传输对象)? [复制]

何时使用 Servlet 或 @Controller

何时使用IdentityServer 3进行OAuth

SOA 与 MVC - 何时使用

iOS 应用程序不在后台运行 = YES - 我如何检查用户何时退出应用程序

Spring MVC 中 Web 请求生命周期的开始和结束