天天看点

《精通 ASP.NET MVC 4》----1.3 ASP.NET MVC的关键优点

本节书摘来自异步社区《精通 asp.net mvc 4》一书中的第1章,第1.3节,作者: 【美】adam freeman ,译者: 李萍 , 徐燕萍 , 林逸 , 更多章节内容可以访问云栖社区“异步社区”公众号查看。

精通 asp.net mvc 4

asp.net已经获得了巨大的商业成功,但正如所讨论的,其他web开发领域也在进步,即使是微软也在不断清理web form的垢病,因为其基本设计看上去已经相当陈旧了。

2007年10月,在德克萨斯-奥斯汀举行的第一次alt.net国际会议上,微软副总裁scottguthrie宣布并演示了崭新的mvc web开发平台,它建立在核心asp.net平台之上,明确地作出对rails等技术进展的直接回应,以及对web form批评的反应。以下小节将描述这个新平台如何克服web form的局限性,并把asp.net重新带回到先进行列。

区别mvc体系结构模式与asp.net mvc框架非常重要。mvc模式并不新——这要回溯到1978年xerox parc的smalltalk项目——但它作为一种web应用程序的模式,如今已得到了广泛的普及,原因如下。

用户与mvc应用程序的交互遵循一种自然的循环:用户采取一个动作,应用程序对其作出响应,修改其数据模型,并把一个更新的视图提供给该用户,然后重复这一循环。这非常适合于以一系列http请求与响应进行传递的web应用程序。

web应用程序必须组合多种技术(如数据库、html、可执行代码等),这通常被分成一系列层次。这种组合所产生的设计模式能够自然地映射到mvc的概念上。

asp.net mvc框架实现了这种mvc模式,而且在实现过程中还极大地改善了关注分离。事实上,asp.net mvc实现了mvc模式的现代化变异,使它特别适用于web应用程序。读者将在第3章更多地了解这种体系结构的理论与做法。

通过采纳和调整mvc模式,asp.net mvc框架对roby on rails以及类似平台形成了强有力的竞争,并把mvc模式带到了.net世界的主流。利用开发人员使用其他平台的经验和最佳实践,asp.net mvc在许多方面的推进甚至已经超越了rails。

桌面电脑的内部组件是一个个独立的部件,它们只通过标准的公共文档接口进行交互。人们可以很容易地拔出显卡或硬盘,并用另一制造商的产品来替换,相信它会在插槽中正常工作。mvc框架也被构建成一系列独立的组件——满足一个.net接口,或建立在一个抽象类之上。因此,开发者可以很容易地用一个自己的不同实现来替换相应组件,如:替换路由系统、视图引擎、控制器工厂等。

asp.net mvc设计者对每一个mvc框架组件都提供了3种选择。

使用组件现行的默认实现(它应该足以满足大多数应用程序)。

派生默认实现的一个子类,以调整其行为。

用接口或抽象基类的一个新实现来完全替换该组件。

这就像自asp.net 2.0开始的提供器模型一样,而且还向前跨了一大步——深入到了mvc框架的核心部分。从第12章开始,读者将了解所有这些各种各样的组件,以及如何和为什么要调整或替换这些组件。

asp.net mvc认识到,产生整洁、与标准兼容的标记的重要性。其内建的html辅助器方法可以产生与标准兼容的输出,但与web form相比,还有一种更重要的理念上的变革。mvc框架鼓励使用构思简单、优雅、可设置css样式的标记,而不是生成大片难以控制的html标记。

当然,如果用户确实想将一些现成的部件用于复杂的ui元素,如日期选择器或级联菜单等,asp.net mvc的“无特殊需求”标记方法可以很容易地使用最佳品种的ui库,如jquery库或yahoo ui库等。微软已经将jquery装配为默认的asp.net mvc项目模板的一个内建部件,asp.net mvc与流行的jquery库啮合得如此良好,甚至能够直接引用微软的内容分发网络(cdn,content delivery network)服务器上的jquery.js文件。javascript开发者们如果了解到这些,一定会感到非常开心。

asp.net mvc生成的页面不含任何视图状态数据,因此,这些网页可能比典型的asp.net web form页面要小几百kb。无论今天的高速宽带如何,这种对带宽的节约仍然极大地改善了最终用户的体验。

与ruby on rails一样,asp.net mvc与http工作得十分协调。用户对传递于浏览器与服务器之间的请求有完全的控制,因此只要用户愿意,就可以仔细地调整用户体验。ajax很容易使用,而且没有任何自动回发来扰乱客户端状态。任何一个专注于web的开发人员都会觉得这是极大的解放,且让人工作时心情愉快。

mvc体系结构为用户提供了很棒的起点,以使应用程序可维护和可测试,因为用户可以自然地把应用程序的不同关注分成不同的、独立的软件片段。asp.net mvc的设计者们还不止做了这些。为了支持单元测试,他们对该框架采取了面向组件的设计,并确保把每个独立的片段构造成满足单元测试和模仿工具的需求。

添加了visual studio向导,让用户创建初步的单元测试项目,该项目集成了开源的单元测试工具,如nunit和xunit,以及微软自己的mstest。即使以前从未编写过单元测试的人,也会有一个很好的开始。

读者将会在本书中看到,如何为asp.net mvc的控制器以及动作编写整洁、简单的单元测试示例。这些单元测试使用各种测试和模仿策略,提供对框架组件的伪造或模仿实现来模拟各种情景。

可测试性并不仅仅是单元测试的事情。asp.net mvc应用程序也可以与ui自动化测试工具良好协作。用户可以编写模拟用户交互的脚本,而不必猜测框架会生成什么样的html元素结构、什么样的css的class,或什么样的id等,也不必担忧这种结构的意外变化。

随着web应用程序技术的改进,url的样式也已经发生了演变,如下面所示的url。

<code>/app_v2/user/page.aspx?action=show%20prop&amp;prop_id=82742</code>

这种url已经明显很少见到了,取而代之的是一种更简单、更清晰的格式,如下所示。

<code>/to-rent/chicago/2303-silver-street</code>

采用这种url结构有一些很好的理由。首先,搜索引擎对url中找到的关键词有明显的权重。一个对“芝加哥租房”的搜索,更可能找到的是一个较简单的url。其次,许多web用户现在对url有了足够的领悟,并且乐于直接在浏览器的地址栏中输入。再次,当理解了url的结构时,人们才会更可能链接它,与朋友共享它,或在电话中报读它。最后,这种url并不会把应用程序的技术细节、文件夹、文件名结构暴露给整个公用网,因此,人们可以自由地修改底层实现而不会破坏输入链接。

整洁的url在早期的框架中难以实现,但asp.net mvc会默认使用system.web.routing工具给出整洁的url。这让用户能够完全控制url方案及其与应用程序的关系,使用户能自由地创建对用户有意义和有用的url模式,而无须遵守预定义模式。当然,这也意味着,如果用户愿意,可以很容易地定义现代rest风格的url方案。读者将在第13章和第14章了解路由的整个处理和url的最佳做法。

微软当前的asp.net平台为开发高效的web应用程序提供了一系列成熟的、经充分验证的组件和工具集。

首先,也是最明显的,由于asp.net mvc是基于.net平台的,因此可以灵活地使用任何.net语言来编写代码,并访问同样的api特性——不仅仅是mvc本身的特性,而是广泛的.net类库和大量的第三方.net类库体系。

其次,已形成的asp.net平台特性,如母版页(master page)、表单认证(forms authentication)、成员(membership)、角色(roles)、简档(profiles),以及国际化(internationalization)等,可以减少开发和维护web应用程序所需的代码量。而且这些特性在mvc框架中的使用同在经典的web form项目中的使用一样有效。用户可以在asp.net mvc应用程序中重用web form内建的服务器控件,以及早期的asp.net项目中的自定义控件(只要它们不依赖于web form的专有概念,如视图状态)。

自2002年初以来,微软的.net平台经过了不懈的演变,现在,在许多方面的支持甚至定义了达到最新技术发展水平的现代编程。

asp.net mvc 4是针对.net 4.5而建立的,因此它的api可以充分利用最新语言和运行时的创新,包括await关键字、扩展方法、lambda表达式、匿名及动态类型,以及语言集成查询(linq)等。许多mvc框架的api方法和编码模式与早期平台相比,遵循了一种更清晰、更富表现力的写作方式。

与之前的微软web开发平台不同,现在人们可以自由地下载asp.net mvc的源代码,甚至修改和编译自己的版本。在调试跟踪深入到系统组件,以及想步入其代码内部(甚至读取原程序员的注释)时,这种开源都是无价的。如果正在建立高级组件,并想看看有什么(可进一步)开发的可能性,或者想了解内建组件如何工作等情况时,这种开源也是很有用的。

本文仅用于学习和交流目的,不代表异步社区观点。非商业转载请注明作译者、出处,并保留本文的原始链接。

继续阅读