本文地址:http://www.cnblogs.com/outtamyhead/archive/2013/04/08/3007234.html ,转载需保留本地址。
说在前面:
1、由于是头次翻译整本书籍,所以错误难免,希望大家都提出来,翻译的不好还望大家少拍砖多鼓励。
2、该系列没有按照原文直译,而是加入了我的一些言语在里面(在没有改变原意的情况下),所以大家在看的时候希望有所对照。
3、该系列每周出一或二篇博客,因为我最近很忙,一直在加班,很累的说。
4、该系列不提供原版文字,希望看原版的可以自行下载Pdf。
5、该系列省去了前面的废话,单刀直入,讲主体内容。
第三章:MVC模式(一)
在第7章,我们打算创建一个比较复杂的ASP.NET MVC示例。在开始挖掘更多MVC框架详细功能之前,我们希望你能大致熟悉MVC设计模式,并以它的方式进行思考。在本章,我们将描述下述内容:
MVC架构模式
域模型和数据仓库
用依赖注入(DI)创建松耦合系统
自动测试基础
你可能已经熟悉了本章描述的一些想法和规范,尤其是如果你完成过高级ASP.NET开发或者C#开发。如果没有,我们希望你能认真的阅读本章内容--很好的理解MVC背后的事情,有助于在阅读本书的过程中,把这个框架的特性放到相关的语境中。
MVC历史
略
理解MVC模式
在高级层面来说,MVC模式意味着MVC应用程序至少会被分为3部分:
Models:包含或者描述用户使用的数据。这些可以是简单的视图模型,它只描述在视图和控制器之间传递的数据;或者它们可以是主域模型,它包含在业务方面的数据以及处理这些数据的操作、转换、和规则。
Views:被用在渲染模型的某些部分作为用户界面。
Controllers:它处理传入的请求,在模型上执行操作,并选择和渲染要展现给用户的视图。
模型是你用来工作的应用程序世界的定义。例如,在一个银行项目中,模型描述了应用程序支持的银行的任何东西,如账号、总账、客户的的信用额度--以及那些可以用来操作模型数据的操作,像存入资金,从账户提款。模型也负责保存全局状态和数据的一致性--例如,确保所有交易添加在分账中,客户没有提取超过他存入银行数额上限的钱。
理解域模型
MVC程序中最重要的部分是域模型。我们通过存在于工业或活动中的真实世界的对象、操作和规则来创建模型并且我们的程序必须支持,这就是域。
随后我们创建这个域的软件标识--域模型。为了我们的目的,这个域模型是一组C#类型(类,结构,等),统称为域类型。域中的操作由定义为域类型的方法标识,而域规则则由这些方法里的逻辑来标识--或者,如我们在前面章节看到的,通过在方法上添加C#特性来标识。当我们创建一个域类型的实例来描述特定数据,我们就创建了一个域对象。域模型通常是保持的并长期活动的--这有很多种不同的方式来实现,但是关系型数据库是最常用的选择。
简言之,域模型是程序中业务数据和数据处理唯一权威的定义。一个保持的域模型也是域表现状态的权威定义 。
域模型的方法解决了许多智能UI模式中出现的问题.我们的逻辑方法只包含在一个地方--如果你需要操作模型里的数据或者添加一个新的过程或者规则,域模型是你应用程序中唯一变化的部分。
提示:从一个ASP.NET MVC应用程序的其余部分分离域模型的一种常见方式是把模型放在单独的C#程序集中。用这种方式,你可以从程序的其他部分创建对域模型的引用,但是要确保没有在其他方向进行引用。这在大规模的项目中十分有用。我们会在第7章的示例中使用这种方式。
模型也可以由不是它们负责的内容来定义:模型不涉及渲染UI和处理请求--那些是视图和控制器的职责。视图包含模型元素要显示给用户的逻辑--其它什么都没有。它们并不直接的感知模型并且不直接与模型进行通信。控制器则是视图和模型的沟通桥梁--来自客户端的请求由控制器提供服务,选择合适的视图展现给用户,并且,如果需要,执行模型上的相应操作。
MVC架构的每一部分都是明确定义和自包含的--这叫做关系分离。模型数据的逻辑操作只包含在模型中;展现数据的逻辑只包含在视图中并且处理用户请求和输入的代码只包含在控制器中。每一部分的彼此都有清晰的区分,你的应用程序会很容易维护和扩展,无论它会变多大。
ASP.NET MVC 的实现
在MVC中,控制器是C#类,通常源自System.Web.Mvc.Controller类。类里的每一个源自Controller类的Public方法都被称作动作方法,它与一个通过ASP.NET 路由系统可配置的URL相关联。当一个请求发送到一个与动作方法相关联的URL时,控制器类的相应代码块就会被执行以完成在域模型上的一些操作然后选择一个视图展现在客户端。图3-1说明了控制器、模型和视图之间的交互。
MVC框架为视图引擎的选择提供支持。MVC的早起版本使用标准的ASP.NET视图引擎,通过使用Web窗体标记语言的精简版来处理ASPX页面。MVC3引入了Razor视图引擎,并在MVC4中得到细化并且使用了完全不同的语法(在第5章会介绍)。Visual Studio提供智能感应支持对这两个视图引擎,使得把控制器提供的数据注入到视图和对视图进行响应成为一件简单的事。
MVC没有在实现你的域模型时添加任何约束。你可以用规则的C#对象生成一个模型并可以用任何数据库、ORM框架、或者.NET支持的其他数据工具来实现保持。Visual Studio创建了一个Models文件夹作为MVC项目模板的一部分。这对简单的项目很合适,但是更复杂的程序倾向在单独的项目中定义他们的域模型。我们会在本章的后面讨论域模型的实现。