微软为什么选择MVC作为ASP.NET的架构?

3
除了成为一种30年的设计模式,MVC从未适用于当前应用。MVP是它的后继者,旨在处理90年代出现的基于事件的应用程序。被广泛使用的是Passive View和Supervising Controller模式。对于这两种模式,几乎不需要谈论MVC / MVP。
具体而言,在ASP.NET MVC中,控制器操作返回一个视图,是否创建该视图?在MVC中,控制器不会创建视图或与其进行通信。将ASP.NET MVC称为MVC实现有多准确?或者,什么名字更准确?

1
我曾经想过为什么他们会推出MVC,然后又像它是世界上最新的东西一样宣传。当我从简单的代码后端转向j2ee时,我发现许多人已经使用MVC超过十年了。当我长时间坚持一个供应商时,我感到被欺骗了。 - johnny
3
控制器不会返回视图本身,控制器会返回视图数据,而视图引擎通常负责呈现视图,因此名称是准确的。我相信http://www.castleproject.org/对于微软创建ASP.NET MVC有很大的启发作用。 - Todd Smith
9个回答

14

我认为Ruby on Rails启发了微软创建asp.net MVC。


它确实使他们能够在该领域竞争,尽管我认为这是因为Web表单从设计上就有缺陷:P - annakata

13

ASP.NET MVC简单地说就是微软承认了诸如Ruby on Rails和Django等Web框架中MVC实现的成功。它意识到许多Web开发人员希望更加亲身参与Web开发,采用“基于约定而非配置”的编程模型(惯例高于配置),并远离ASP.NET WebForms提供的有状态抽象。

它是否完全实现了Smalltalk MVC模式?不是。它是因为恐慌而产生的结果吗?不是。它是Ruby on Rails和Django的成功的结果吗?是的。

我喜欢这个模型,因为它既拥抱了.NET和ASP.NET堆栈提供的丰富框架,同时在方法上保持了极简主义,使用基于约定的开发方式。


8

足够接近,这是一种销售策略。

他们将ASP.NET与自称为MVC的其他技术进行比较销售。因此,将其命名为同一类别对于竞争非常有用。

微软更多地通过产品定位而非准确的技术识别来获胜。(在我看来还有长期交付。)


4

ScottGu在他的第一篇关于MVC演示的博客文章中提到了答案。简单来说,是因为有人要求并且微软决定采用它。这符合当前.Net模型尽可能添加更多选项的趋势,使框架能够覆盖更广泛的目标市场,并为开发人员提供适用于不同项目的正确工具。


2

ASP.NET MVC 实现的 MVC 不是旧有的 MVC 模式。在我所谓的 "经典" MVC 中,View 直接但只读地访问 Model,在 ASP.NET MVC 中,直接从 View 访问业务模型被认为是不好的做法。最终你得到的是非常类似于 Supervising Controller + Passive View 的东西:

public class MvcExampleController : Controller
{
    public ActionResult ActionMethod(BoundInputData inputData)
    {
        var results   = DoActualWorkInTheModelWith(inputData);
        var viewModel = CreateViewModelFromThe(results);

        return View(viewModel);
    }
}

对我来说,这更像是监控控制器而不是经典的MVC。一旦Model完成工作,View就会传递一个ViewModel(又称PresentationModel)。ViewModel通常与视图中的UI元素呈1对1关系,并且可能或可能不像实际Model中的对象。在ViewModel上运行的View与实际Model无关,这让我想到了被动视图。
我不会讨论这是否是“真正”的MVC实现,但如果你认为ASP.NET MVC不使用现代Web设计模式,我必须反对。

1

最好的猜测,每个人都听说过MVC。 MVC已经成为“最佳实践”已经有一段时间了,因此整整一代(或两代,三代)开发人员看到MVC并想到快乐的事情。

此外,许多其他框架也以类似的方式宣扬MVC,因此微软可能感到有必要这样做。

简而言之,我非常怀疑这里有强有力的技术原因。


1

4
我认为他们实施MVC的原因之一是为了摆脱后台提交模型(postback model)。 - rojoca
2
Postback模型有其缺点,例如HTML膨胀和默认创建的所有ViewState。MVC设计模式的最大优势是没有代码后置文件,因此它可以使用诸如MBUnit之类的工具方便地进行自动化单元测试。我写的文章是一个保持postback模型但同时实现了一个设计,也允许完全自动化单元测试的示例。 - user100985

0

这是一个很好的问题,在MVC早期,很多人都问过这个问题。以下是项目主要开发者之一Phil Haack的答案!

http://haacked.com/archive/0001/01/01/everything-you-wanted-to-know-about-mvc-and-mvp-but.aspx

看看这个,阅读链接,然后展开。

另外,也许对于这场辩论的答案是 S#arp Architecture。他们在MVC上构建了一个层,使其更像MVP。如果您正在寻找类似的解决方案,请查看它们。

祝你好运!


谢谢,但他的结论非常错误 -“这个框架(即ASP.NET MVC)采用MVC模式而不是MVP模式,因为它不试图模拟丰富的客户端开发,因此MVC模式更合适。”现代Web应用程序和现代客户端应用程序一样,使用MVP。这在Web应用程序中发生,因为Web浏览器处理用户输入。你很难找到一个使用MVC的应用程序,这意味着控制器直接处理用户输入。 - 4thSpace

-3

我认为这更像是一种“恐慌营销决策”,而不是技术决策。RoR每秒钟都在窃取市场,微软完全惊慌失措,因此微软觉得他们必须提供一些东西,让他们有机会重新获得一些炒作的声音...

此外,他们需要帮助他们的开发人员再次获得自尊心,通过将这个炒作的词与自己联系起来,以便.Net开发人员可以再次自豪地看着镜子,而不会因为他们的选择平台没有为他们提供这种模式(开箱即用)而感到羞愧。

对于一个中等水平的(.Net)开发人员来说,当一个中等水平的RoR开发人员启动rake并在不到15分钟内创建一个工作和运行的概念证明时,很难不感觉自己像一只恐龙,而.Net开发人员甚至还没完成启动vstudio.exe... ;)

我想这是一个有争议的立场,但这是我的立场,我会坚持到底... ;)

今天有无数例子证明,MVC和脚手架确实可以给你一个初始速度提升。但是就可维护性、代码重用、封装性以及几乎每个真正重要的事情而言,MVC并不是万能的解决方案,大多数情况下WebForms在长期使用中更为优越(除非当然像厕纸一样被使用)。

8
不同意恐慌营销的说法。这是Phil Haack和Scott Guthrie主导的内部项目,营销团队并没有掌控此事。这完全是由开发人员主导的。 - p.campbell
2
我也不同意上述观点。在我实现Web Forms的环境中,像视图状态这样的概念已经引起了无尽的问题。我也看不出Web Forms更容易维护的地方。MVC并不是万能的解决方案,但在某些情况下绝对是一个很好的替代选择。 - Diago
9
你真的认为 RoR 让微软 "恐慌" 了吗?你需要多出去走走。 - NotMe
对于上面的三条评论,你能详细解释一下ASP.NET如何是MVC吗?我正在与原始的SmallTalk-80实现进行比较,因为其他所有东西都只是变异。 - 4thSpace
1
我怀疑Microsoft不会因为RoR之类的事情而惊慌失措地交付像ASP.NET MVC这样大规模的东西。MVC是人们要求的东西,它是一种成功的Web开发方法。这只是Microsoft用一个成功的开发平台回应顾客需求。 - jrista
@4thSpace:经典的SmallTalk-80实现是针对互联网之前的基于文本屏幕的。尽管我们现在将视图呈现为丰富的标记和JavaScript,但概念仍然相同。无论是屏幕上的文本还是漂亮的网页,它们仍然是视图。无论您是响应低级键盘命令还是高级操作,它们仍然由集中式控制器处理。模型就是模型...无论是MVC还是其他。;) 就算在视图和控制器之间的事情已经改变了(通过Url执行操作而不是键盘按键),但实际概念本身仍然是相同的。 - jrista

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