ASP.NET MVC 模式-程序员宅基地

ASP.NET MVC 是一个全新的Web应用框架

  • ASP.NET 代表支撑应用框架的技术平台,表明ASP.NET MVC和传统的WebForm应用框架一样,都是建立在ASP.NET平台之上。
  • MVC 表示该框架背后的设计思想,意味着ASP.NET MVC采用了MVC架构模式。

MVC在20世纪70年代后期出现,产生于Xerox PARC施乐公司的帕洛阿尔托研究中心的Smalltalk项目,当时将其构想为早期GUI应用程序的一种组织方式。最初的MVC模型的某些细节依赖于Smalltalk特有的概念,如屏幕和工具等,但更广泛的概念仍然适用于现在的应用程序,特别适用于Web应用程序。

与MVC应用程序的交互遵循着用户动作和视图更新的自然周期,在此周期中,假设视图是无状态的,这与支撑Web应用程序的HTTP请求和响应方式非常吻合。

进一步地,MVC强制关注分离(Separation of Concerns) - 域模型与控制器逻辑与UI用户界面是松耦合关系。在一个Web应用程序中,这意味着凌乱的HTML与应用程序的其他部分是分离开来的,从而使维护与测试更加简单容易。这导致Ruby on Rails称为复兴的MVC主流,并使其称为MVC模型的实现模板。自MVC出现并显现出优势后,许多其他MVC框架也相继出现。

从高级术语上说,MVC模式意味着一个MVC应用程序将被分离成至少3个部分。

  • 模型(Model)
    含有或表现用户进行操作的数据,模型可以是简单的视图模型(ViewModel),它们只表现视图与控制器之间传递的数据,也可以是域模型(Domain Model),它包含业务领域的数据,以及处理这些数据的操作、转换、规则。
    模型是对应用程序工作的定义,负责保持数据的整体状态和一致性。模型也由不是其职责的内容来定义:模型不涉及UI渲染或请求处理,那些是视图和控制器的职责。视图含有将模型元素显示给用户的逻辑,见此而已。它们不直接感知模型,也不以任何方式与模型直接通信。控制器是视图与模型之间的桥梁,请求来自客户端,并由控制器对其进行服务,而今选择一个相应的视图向用户进行显示,并在必要时执行模型上的相应操作。
    MVC应用程序最重要的部分是域模型,对于应用程序必须支持的业务或活动中存在的现实实体、操作、规则等,可以通过对它们进行标识的方法建立模型,这种模型被称为域(Domain)。
    为了实现ASP.NET MVC框架这一目的,域模型往往是一组C#类型(类、结构等),统称为域类型(Domain Type)。域中的操作类型中定义的方法来实现。而域规则表示成这些方法中的逻辑。或者通过运用C#的注解属性来实现。当创建一个域类型来表现特定的数据片段时,便创建了一个域对象(DomainObject)。域模型通常是持久化的,且一直处于活动状态,其实现由许多不同方式,但关系型数据库时最通常的选择。
    简言之,域模型是应用程序中有无数据及其处理的唯一和权威的定义,一个持久化的域模型也是域所表现的状态的权威定义。
    域模型方法解决了应用程序维护中出现的许多问题,如操纵模型中数据、添加新的过程或规则、域模型是应用程序必须修改的唯一地方。
  • 视图(View)
    用于将模型的某些部分渲染成用户界面
  • 控制器(Controller)
    处理传入的请求,执行模型上的操作,并选择渲染给用户的视图。

MVC架构的每个部分都是定义良好和自包含的,这称为关注分离。模型中操作数据的逻辑仅包含在模型中,显示数据的逻辑仅包含着在视图中,处理用于请求和用户输入的代码仅包含在控制器中。利用各部分之间清晰的分离,无论应用程序有多大,在其整个生命周期中都会更易于维护和扩充。

传统MVC模式

对于面向最终用户的应用来说,需要具有一个与用户进行交互的可视化UI界面,又称为视图(View)。

在早期倾向于将所有与UI相关的操作糅合在一起,这些操作包括UI界面呈现、用户交互操作的捕获与响应、业务流程的执行、对数据的存取等。这种设计模式被称为自治视图(Autonomous View,AV)。

自治视图

典型的人机交互应用具有3个主要的关注点:数据在可视化界面上的呈现、UI处理逻辑(用于处理用户交互式操作的逻辑)、业务逻辑。自治视图模式将三者混合在一起,势必带来问题。

  • 重用性

业务逻辑是与UI无关的,应该最大限度地被重用。将业务逻辑定义在自治视图中,相当于将它完全与视图本身绑定在一起。若将UI的行为抽象出来,基于抽象化UI的处理逻辑也是可以被共享的,但是定义在自治视图中的UI处理逻辑也完全丧失了重用的可能。

  • 稳定性

业务逻辑具有最强的稳定性,UI处理逻辑次之,可视化界面上的呈现最差。将不同稳定性的元素混合一体,具有最差稳定性的元素决定了整体的稳定性,这是“短板理论”在软件设中的体现。

  • 可测试性

任何涉及UI的组件都不易测试,因为UI是呈现给人看的,并且会与人进行交互,用机器来模拟对组件实施自动化测试本身就不是一件容易的事。

为了解决自治视图导致的问题,采用“关注点分离”(Seperation of Concerns, SoC)的原则将可视化界面呈现、UI处理逻辑、业务逻辑三者分离,并采用合理的交互方式将他们之间的依赖降到最低,即MVC。

MVC 范例

MVC的创建者挪威计算机专家,奥斯陆大学名誉教授 Trygve M. H. Reenskau。MVC是他在1979年访问施乐帕克研究中心(Xerox Palo Alto Research Center, Xerox PARC)期间提出的一种针对GUI应用的软件架构模式。

MVC体现了“关注点分离”设计方针,将人机交互引用设计的功能分为Model、Controller、View三部分,各司其职。

  • Model

Model是对应用状态和义务功能的封装,可理解为同时包含数据和行为的领域模型(Domain Model)。

Model接受Controller的请求并完成相应的义务处理,在应用状态改变时向View发出相应的通知。

  • View

View实现可视化界面的呈现并捕获最终用户的交互操作,View捕获到的用户交互操作后会直接转发给Controller,后者完成相应的UI逻辑。如果需要涉及业务功能的调用,Controller会直接调用Model。在完成UI处理之后,Controller会根据需要控制原View或创建新的View对用户交互操作予以响应。

4933701-e210f2696c87558d.png
MVC之间的交互

传统的MVC很多人会认为Controller仅仅是View和Model之间的中介,实则不然,View和Model之间存在直接联系,View不仅可以直接调用Model查询其状态信息,当Model的状态发生改变的时候,也可以直接通知View。例如股价实时价位的应用中维护股价的信息的Model,在股价变化的情况下可直接通知相关的View改变其显示状态。

从消息交互模式的角度来讲,无论是Model在应用状态发生改变时通知View,还是View在捕获到用户交互操作后通知Controller,消息都是以“单向(One-Way)”方式流动的,推荐采用事件机制来实现两种类型过的通知。

从设计角度来讲,采用观察者模式(Observer)通过注册/订阅的方式来实现,具体来讲就是让View作为Model的观察者,通过注册相应的事件来检测状态的改变。让Controller作为View的观察者,通过注册相应的事件来处理用户的交互操作。

MVC和所谓的“三层架构”两者没有什么可比性,MVC更不是分别对应UI、业务逻辑、数据存取三个层次。Trygve M. H. Reenskau提出MVC是将其作为构建整个GUI应用的架构模式,它更多地体现为一个领域模型。对于多层架构来说,MVC是被当成UI呈现层(Presentation Layer)的设计模式,Model则更多体现为访问业务层的入口(Gateway)。

MVC 变体

采用MVC范例将可视化UI元素的呈现、UI处理逻辑、业务逻辑分别定义在View、Controller、Model中。MVC并没有对三者之间的交互进行严格的限制,主要体现在它允许View和Model绕开Controller进行直接交互,不仅View可以通过调用Model获取需要呈现给用户的数据。Model也可以直接通知View让其感知到应用状态的变化。将MVC范例应用于具体的项目开发时,不论是基于GUI的桌面应用或是基于浏览器的Web应用,如果不多MVC之间的交互作更为严格的约束,编写的程序可能比自治视图更加难以维护。

现在MVC被视为一种模式(Pattern),而最初的提出者却将其视为一种范例(Paradigm)。模式和范例的区别在于,模式可以直接在具体的应用上使用,范例仅仅提供基本指导方针。

软件设计的发展历程中出现了MVC的变体(Variation),它们遵守定义在MVC中的基本原则,但对于三者之间的交互制定了更为严格的规范。

MVP

“模型-视图-呈现器(Model-View-Presenter, MVP)”是MVC的一种变异,以便更容易地适应状态化的GUI平台,如Windows Form或ASP.NET Web Form。

MVP模式中,呈现器P具有与MVC控制器同样的职责,但它与状态化视图有更直接的关系,根据用户的输入和动作,直接管理着UI组件中显示的数据。

该模式有以下两种实现:

  • 被动式视图(Passive View)实现:此种实现中,视图不包含逻辑,是UI控件的容器,由呈现器直接进行操纵。
  • 监管控制器(Supervising Controller)实现:此种实现中,视图可能要负责一些具有表现逻辑的元素,如数据绑定,并给出对域模型数据源的引用。

这两种实现之间的差别涉及视图如何智能化,任何一种方式,呈现器与GUI框架都解耦的,这使得呈现器逻辑简单且易于单元测试。

MVP是一种广泛使用的UI架构模式,适用于基于事件驱动的应用框架,比如ASP.NET Web Forms和Windows Forms应用。

MVP中的M和V分别对应于MVC的Model和View,而P(Presenter)则自然代替了MVC中的Controller。MVP并非仅仅体现在从Controller到Presenter的转换,更多地体现在Model、View、Presenter之间的交互上。

MVC范例中三元素之间混乱的交互主要体现在允许View和Model绕开Controller进行单独交流,这个问题在MVP中得到了彻底解决。

4933701-078dcebef7cba97d.png
MVP三者交互

能够与Model直接进行交互的仅限于Presenter,View只能通过Presenter间接地调用Model。Model的独立性在这里得到了真正的体现,它不仅仅与可视化元素的呈现(View)无关,与UI处理逻辑(Presenter)也无关。使用MVP的应用是用户驱动而非Model驱动的,所以Model无需主动通知View以提醒状态发生了改变。

MVP不仅避免了View和Model之间的深度耦合,更进一步降低了Presenter对View的依赖。Presenter依赖的是一个抽象化的View,即具体View实现的接口IView,这带来的最直接的好处就是使定义在Presenter中的UI处理逻辑变得更易于测试。由于Presenter对View的依赖行为定义在接口IView中,仅需Mock一个实现了该接口的View就能对Presenter进行测试。

MVP三要素的交互主要体现在:View与Presenter、Presenter与Model之间的交互。Presenter和Model之间的交互很清晰,仅仅体现为Presenter对Model的单向调用。View和Presenter之间采用怎样的交互式整个MVP的核心。MVP针对关注点分离的初衷能否体现在具体的应用中,很大程序上取决于两者之间的交互方式是否正确。

按照View和Presenter之间的交互方式,以及View本身的职责范围,Martin Folwer将MVP分为PV(Passive View)和SC(Supervising Controller)两种模式。

MVVM

“模型-视图-视图模型(MVVM, Model-View-View Model)”模式是MVC的最新变异,源于微软并被应用于WPF。在MVVM模型中,模型和视图具有与MVC同样的作用。所不同的是MVVM中关于视图模型的概念,是用户界面的一种抽象表示 -- 典型地是一个C#类,它即暴露了视图中待显示数据的模型属性,也暴露了能够通过UI进行调用的对数据的操作。与MVC的控制器不同,MVVM视图模型没有视图或任何特定UI技术的观念。MVVM视图使用WPF的绑定(Binding)特性,将视图控件所暴露的属性与视图模型所暴露的属性双向地关联在一起。

Model2

MVC最初作为桌面应用的架构模式并不太适合Web,Web应用于桌面应用的主要区别在于用户是通过浏览器与应用进行交互,交互请求和响应是通过HTTP请求和响应来完成的。

为了让MVC能够为Web应用提供原生的支持,Java阵营提出了Model2的Web架构模式。JavaWeb具有两种基于MVC的架构模式,分别称之为Model1和Model2,Model1类似自治视图模式。

为了让开发者采用相同的编程模式进行桌面应用和Web应用开发,微软通过ViewState和Postback对HTTP请求和响应机制进行了封装,能够像编写WindowsForms应用一样采用事件驱动的方式进行ASP.NET Web Forms应用的编程。Models则采用完全不同的设计,让开发者直接面向WEB,关注HTTP的请求和响应,所以Model2提供对Web引用原生的支持。

对于Web应用来说,和用户直接交互的UI界面由浏览器来呈现,用户交互请求通过浏览器以HTTP请求的方式发送到Web服务器,服务器对请求进行相应的处理并最终返回一个HTTP回复对请求予以响应。

Model2中一个HTTP请求的目标是Controller中某个Action,具体体现为定义在Controller类型的某个方法,所以对请求的处理最终体现在对目标Controller对象的激活和对目标Action方法的执行。一把来说,Controller的类型和Action方法的名称及作为Action方法的部分参数可直接通过请求的URL解析出来。

4933701-f014a9879c44858c.png
Model2的交互流程

通过拦截器(Interceptor)对抵达Web服务器的HTTP请求进行拦截,Web应用框架都提供了这样的拦截机制。对于ASP.NET来说,通过HttpModule的形式来定义这样的拦截器。拦截器根据当前请求解析出目标Controller的类型和对应的Action方法的名称,随后目标Controller被激活,相应的Action方法被执行。

目标Action方法被执行过程中,可调用Model获取相应的数据或改变其状态。在Action方法执行的最后阶段一般会创建一个View,后者最终被转换成HTML以HTTP响应的形式返回到客户端并呈现在浏览器中,绑定在View上的数据来源于Model或基于显示要求进行简单逻辑计算,有时将其称为VM(View Model),即基于View的Model。

ASP.NET MVC 与 Model2

ASP.NET MVC是根据Model2模式设计的,对HTTP请求进行拦截以实现对目标Controller和Action名称的解析式通过一个自定义HttpModule来实现的,目标Controller的激活和Action方法的执行是通过一个自定义HttpHandler来完成的。

MVC的Model主要体现为维持应用状态并提供业务功能的领域模型,或者是多层架构中进入业务层的入口合伙业务服务的代理,但是ASP.NET MVC中的Model还是这个Model吗?ASP.NET MVC的Model仅仅是绑定到View上的数据而已,和MVC中的Model并不是一回事儿。由于ASP.NET MVC中的Model是服务于View的,可见其成为ViewModel。

由于ASP.NET MVC只是View Model,所以ASP.NET MVC应用框架本身仅仅关注View和Controller,真正的Model以及Model和Controller直接的交互体现在如何来设计Controller。

MVC的ASP.NET实现

在MVC中,控制器是C#类,派生自System.Web.Mvc.Controller类。从这个Controller派生而来的类中,每个public方法都称为一个动作方法(Action Method),这种动作方法通过ASP.NET的路由系统与一个可配置的URL相关联。当一个请求被发送给一个动作方法相关联的URL时,便会执行控制器中的语句,以进行域模型上的一些操作,然后选择一个视图显示给客户端。

4933701-d2fe6438fe0a2d58.png
MVC应用程序中的交互

ASP.NET MVC框架使用视图引擎(ViewEngine), 该引擎是负责处理视图的组件,以便为浏览器生成响应。MVC的早期版本使用标准的ASP.NET视图引擎,使用改进的WebForm标记语法来处理ASPX页面。

MVC与其他模式比较

  1. 智能UI模式
    智能用户界面(Smart User Interface, Smart UI,智能UI)如Windows Form或ASP.NET Web Form。为建立智能UI应用程序,开发者需构建一个用户界面,通常是将一组组件(Component)或控件(Control)拖放到设计界面或画布上。控件通过对单击按钮、按钮、鼠标移动等发送事件的报告来与用户进行交互。开发者将代码添加到一系列事件处理程序(Event Handler)中,以便对事件作出响应。
4933701-193bb61f147d92f8.png
智能UI模式

智能UI最大的缺点是难以维护和扩展,域模型与带有用户界面代码的业务逻辑混搭在一起,导致了重复。在MVC中,智能UI被认为是一种抵抗模式(Anti-pattern),是不屑一切代价应该避免的。

2.模式-视图架构

模型-视图(Model-View)架构提供了一种改进智能UI的方法,将事务逻辑才抽取形成能独立的域模型。数据、过程、规则被自己集中在应用程序的部件中。不过带来的问题是:UI与域模型结合得十分紧密,对每部分的单元测试都和困难,其次问题来自于实际情况而非模式的定义。模型含有大量数据访问代码,这意味着,数据模型并不仅仅只包含事务数据、操作和规则。

4933701-8c3f78ba6d955615.png
模型-视图架构
  1. MVC
    三级(Three-tier)或三层(Three-Layer)模式将持久化代码从域模型中分离出来,并将其放入一个叫做“数据访问层(DAL, Data Access Layer)”的新组件中。
4933701-5756774b262d1fea.png
MVC

三层架构是事务性应用能程序使用最广泛的模式,对如何实现UI没有约束,并提供了较好的关注分离且又不太复杂。某些情况下DAL能够使单元测试相对容易。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/JunChow520/article/details/103030695

智能推荐

从零开始搭建Hadoop_创建一个hadoop项目-程序员宅基地

文章浏览阅读331次。第一部分:准备工作1 安装虚拟机2 安装centos73 安装JDK以上三步是准备工作,至此已经完成一台已安装JDK的主机第二部分:准备3台虚拟机以下所有工作最好都在root权限下操作1 克隆上面已经有一台虚拟机了,现在对master进行克隆,克隆出另外2台子机;1.1 进行克隆21.2 下一步1.3 下一步1.4 下一步1.5 根据子机需要,命名和安装路径1.6 ..._创建一个hadoop项目

心脏滴血漏洞HeartBleed CVE-2014-0160深入代码层面的分析_heartbleed代码分析-程序员宅基地

文章浏览阅读1.7k次。心脏滴血漏洞HeartBleed CVE-2014-0160 是由heartbeat功能引入的,本文从深入码层面的分析该漏洞产生的原因_heartbleed代码分析

java读取ofd文档内容_ofd电子文档内容分析工具(分析文档、签章和证书)-程序员宅基地

文章浏览阅读1.4k次。前言ofd是国家文档标准,其对标的文档格式是pdf。ofd文档是容器格式文件,ofd其实就是压缩包。将ofd文件后缀改为.zip,解压后可看到文件包含的内容。ofd文件分析工具下载:点我下载。ofd文件解压后,可以看到如下内容: 对于xml文件,可以用文本工具查看。但是对于印章文件(Seal.esl)、签名文件(SignedValue.dat)就无法查看其内容了。本人开发一款ofd内容查看器,..._signedvalue.dat

基于FPGA的数据采集系统(一)_基于fpga的信息采集-程序员宅基地

文章浏览阅读1.8w次,点赞29次,收藏313次。整体系统设计本设计主要是对ADC和DAC的使用,主要实现功能流程为:首先通过串口向FPGA发送控制信号,控制DAC芯片tlv5618进行DA装换,转换的数据存在ROM中,转换开始时读取ROM中数据进行读取转换。其次用按键控制adc128s052进行模数转换100次,模数转换数据存储到FIFO中,再从FIFO中读取数据通过串口输出显示在pc上。其整体系统框图如下:图1:FPGA数据采集系统框图从图中可以看出,该系统主要包括9个模块:串口接收模块、按键消抖模块、按键控制模块、ROM模块、D.._基于fpga的信息采集

微服务 spring cloud zuul com.netflix.zuul.exception.ZuulException GENERAL-程序员宅基地

文章浏览阅读2.5w次。1.背景错误信息:-- [http-nio-9904-exec-5] o.s.c.n.z.filters.post.SendErrorFilter : Error during filteringcom.netflix.zuul.exception.ZuulException: Forwarding error at org.springframework.cloud..._com.netflix.zuul.exception.zuulexception

邻接矩阵-建立图-程序员宅基地

文章浏览阅读358次。1.介绍图的相关概念  图是由顶点的有穷非空集和一个描述顶点之间关系-边(或者弧)的集合组成。通常,图中的数据元素被称为顶点,顶点间的关系用边表示,图通常用字母G表示,图的顶点通常用字母V表示,所以图可以定义为:  G=(V,E)其中,V(G)是图中顶点的有穷非空集合,E(G)是V(G)中顶点的边的有穷集合1.1 无向图:图中任意两个顶点构成的边是没有方向的1.2 有向图:图中..._给定一个邻接矩阵未必能够造出一个图

随便推点

MDT2012部署系列之11 WDS安装与配置-程序员宅基地

文章浏览阅读321次。(十二)、WDS服务器安装通过前面的测试我们会发现,每次安装的时候需要加域光盘映像,这是一个比较麻烦的事情,试想一个上万个的公司,你天天带着一个光盘与光驱去给别人装系统,这将是一个多么痛苦的事情啊,有什么方法可以解决这个问题了?答案是肯定的,下面我们就来简单说一下。WDS服务器,它是Windows自带的一个免费的基于系统本身角色的一个功能,它主要提供一种简单、安全的通过网络快速、远程将Window..._doc server2012上通过wds+mdt无人值守部署win11系统.doc

python--xlrd/xlwt/xlutils_xlutils模块可以读xlsx吗-程序员宅基地

文章浏览阅读219次。python–xlrd/xlwt/xlutilsxlrd只能读取,不能改,支持 xlsx和xls 格式xlwt只能改,不能读xlwt只能保存为.xls格式xlutils能将xlrd.Book转为xlwt.Workbook,从而得以在现有xls的基础上修改数据,并创建一个新的xls,实现修改xlrd打开文件import xlrdexcel=xlrd.open_workbook('E:/test.xlsx') 返回值为xlrd.book.Book对象,不能修改获取sheett_xlutils模块可以读xlsx吗

关于新版本selenium定位元素报错:‘WebDriver‘ object has no attribute ‘find_element_by_id‘等问题_unresolved attribute reference 'find_element_by_id-程序员宅基地

文章浏览阅读8.2w次,点赞267次,收藏656次。运行Selenium出现'WebDriver' object has no attribute 'find_element_by_id'或AttributeError: 'WebDriver' object has no attribute 'find_element_by_xpath'等定位元素代码错误,是因为selenium更新到了新的版本,以前的一些语法经过改动。..............._unresolved attribute reference 'find_element_by_id' for class 'webdriver

DOM对象转换成jQuery对象转换与子页面获取父页面DOM对象-程序员宅基地

文章浏览阅读198次。一:模态窗口//父页面JSwindow.showModalDialog(ifrmehref, window, 'dialogWidth:550px;dialogHeight:150px;help:no;resizable:no;status:no');//子页面获取父页面DOM对象//window.showModalDialog的DOM对象var v=parentWin..._jquery获取父window下的dom对象

什么是算法?-程序员宅基地

文章浏览阅读1.7w次,点赞15次,收藏129次。算法(algorithm)是解决一系列问题的清晰指令,也就是,能对一定规范的输入,在有限的时间内获得所要求的输出。 简单来说,算法就是解决一个问题的具体方法和步骤。算法是程序的灵 魂。二、算法的特征1.可行性 算法中执行的任何计算步骤都可以分解为基本可执行的操作步,即每个计算步都可以在有限时间里完成(也称之为有效性) 算法的每一步都要有确切的意义,不能有二义性。例如“增加x的值”,并没有说增加多少,计算机就无法执行明确的运算。 _算法

【网络安全】网络安全的标准和规范_网络安全标准规范-程序员宅基地

文章浏览阅读1.5k次,点赞18次,收藏26次。网络安全的标准和规范是网络安全领域的重要组成部分。它们为网络安全提供了技术依据,规定了网络安全的技术要求和操作方式,帮助我们构建安全的网络环境。下面,我们将详细介绍一些主要的网络安全标准和规范,以及它们在实际操作中的应用。_网络安全标准规范