一、由问题看本质
(一)什么是MVC?
MVC是Model-View-Controller的简称。它是在1970年引入的软件设计模式。MVC 模式强迫关注分离 — 域模型和控制器逻辑与UI是松耦合关系。从而使应用程序的维护和测试更加简单容易。
(二) 解释一下MVC设计模式?
MVC 设计模式将应用程序分解成3个主要部分: Model, View, Controller(模型、视图、控制器)
Model - 模型代表一系列类用来描述业务逻辑,比如业务模型以及数据访问操作,再比如数据模型。同时也定义了对数据如何进行处理的业务规则。
View - 视图代表的是UI部分,像CSS、jquery、html等。它主要的职责是展现从controller接受到数据或模型。
Controller - 控制器职责在于处理传入的请求。它接受用户通过视图的输入,然后对用户输入的数据模型进行处理,最终通过视图将结果渲染给用户。通常来讲,控制器在视图和模型之间扮演着桥梁(协调者)的角色。
(三) 什么是领域驱动设计开发?
Domain-Driven Design
(DDD)定义了一系列的准则和模式从而时开发者针对不同的领域采取合适的设计方案以开发出优美的系统。DDD既不是一项技术也不是一套方法论。DDD主要由Entity,
Value Object, Aggregate, Service, Repository五大部分组成。
Entity(实体):具有唯一标志的对象,比如用户。
Value Object(值对象):不具有唯一标志的对象,比如枚举。一个值对象也可以是一个实体视情况而定。
Aggregate(聚合): 它通过定义对象之间清晰的所属关系和边界来实现领域模型的内聚,并避免了错综复杂的难以维护的对象关系网的形成。聚合定义了一组具有内聚关系的相关对象的集合,我们把聚合看作是一个修改数据的单元。领域模型:聚合、聚合根详解。
Service(服务):服务是在应用程序中用来处理业务逻辑的。
Repository(仓储):仓储的作用是数据的存储读取,即封装数据持久化框架。它不关心使用何种数据库。仓储也不是我们常说的Data
Access
Layer(数据操作层),但是为了安全因素,仓储会引用一个位置进行存储。仓储的主要职责是处理聚合的和持久化相关的任务(ADD、UPDATE、DELETE、GET)。
(四)解释一下MVP模式?
MVP与MVC相似,只是将MVC的Controller替换成Presenter。MVP模式将应用程序分解成3个主要部分: Model, View, Presenter。
Model - 模型代表一系列类用来描述业务逻辑,比如业务模型以及数据访问操作,再比如数据模型。同时也定义了对数据如何进行处理的业务规则。
View - 视图代表的是UI部分,像CSS、jquery、html等。它主要的职责是展现从controller接受到数据或模型。
Presenter - 职责在于处理视图上的UI行为事件。通过View接收用户输入,然后通过Model处理用户数据,然后将结果传回view。不想View和Controller,View和Presenter之间完全解耦,是通过接口进行交互。同时它也不处理和接收传入的请求。
MVP模式通常用在Asp.net Web Form、Windows Form 应用程序
MVP模式的关键点:
-
用户与View直接交互.
-
View与Presenter是1对1关系,一个View对应一个Presenter
-
View 与 Model 不发生联系,都通过 Presenter 传递。
-
各部分之间的通信,都是双向的。
-
View 非常薄,不部署任何业务逻辑,称为"被动视图"(Passive View),即没有任何主动性,而 Presenter非常厚,所有逻辑都部署在那里。
(五)解释一下MVVM 模式?
MVVM 是指 Model-View-View Model.
MVVM支持在View与ViewModel之间进行双向数据绑定。通过视图模型的状态就能够自动的传播改动到View。通常来说,ViewModel是通过观察者模式将ViewModel的改动通知到View。
Model - 模型代表一系列类用来描述业务逻辑,比如业务模型以及数据访问操作,再比如数据模型。同时也定义了对数据如何进行处理的业务规则。
View - 视图代表的是UI部分,像CSS、jquery、html等。它主要的职责是展现从controller接受到数据或模型。
View Model - ViewModel 的职责是暴露方法、命令以及属性去维护View的状态,操纵Model 作为View执行的结果,以及触发View上自身的事件。
MVVM模式的关键点:
-
用户与View直接交互。
-
View与ViewModel是1对多关系,一个View可以对应多个ViewModel。
-
View保存一个对ViewModel的引用,但是ViewModel对于View一无所知。
-
View和ViewModel之间的数据绑定是双向的。
Angular就是使用这种模式。
(六) 什么是 ASP.NET MVC?
Ans. ASP.NET MVC 是一套基于Microsoft .NET Framework的用来开发web应用程序的开源框架。它确保了代码的干净整洁且关注分离. ASP.NET MVC framework 具有很好的扩展性以及支持自定义。
(七)MVC模式在ASP.NET下是如何工作的?
Ans. 我们按照Model、View、Controller的顺序来一一解释:
The Model in ASP.NET MVC
ASP.NET MVC 中的Model可以分解成几个不同的层:
-
Objects or ViewModel or Presentation Layer - 这一层包含的简单对象或复杂的对象用来进行特定的强类型View的展示。这些对象用来从Controller传递数据到强类型的View,反之亦然。这些对象对应的类通过数据注解指定定的验证规则。通常来说,这些类拥有你想要展示到对应View/Page的属性。
-
Business Layer - 主要用来实现业务逻辑和数据验证。同时通过数据访问层(DAL)将数据持久化到数据库。这一层被Controller直接调用去处理用户输入并将结果返回到View
-
Data Access Layer - 提供对象去访问和操作数据库。通常来说,这一层主要使用一些ORM框架比如EF、NHibernate。
The View in ASP.NET MVC
View就是展示从Controller传递的数据。同时肩负着将Model进行转换以在View的UI上进行展示。
The Controller in ASP.NET MVC
响应Http请求并根据传入的请求内容决定由哪个具体的Action去处理。它通过View接收用户输入,然后通过Model的帮助去处理用户数据并将结果返回给View.
(八)ASP.NET MVC相对于Web Forms的优势有哪些?
主要有以下几点优势:
- Separation of concern(关注分离) - MVC设计模式将Asp.net MVC 应用程序分成三个部分,View、Controller、Model。更容易的去处理程序的复杂性问题。
- TDD(测试驱动开发)- 更好的支持测试驱动开发。
- Extensible and pluggable (扩展性好)- MVC支持可插拔、可扩展。因此更容易进行替换和自定义。
- Full control over application behaviour (对应用程序的完全控制)- MVC 不使用View State,且不依赖于Server。促使程序员可以更好的控制应用的行为同时减少对Server请求的带宽。
- ASP.NET features are supported (强大Asp.net 功能支持)- MVC 框架是基于Asp.net 设计的,因此可以使用Asp.ent包含大部分功能,比如认证、授权,权限和角色控制、缓存、Session等。
- URL routing mechanism (路由机制)- MVC 框架提供了一个强大的Url路由机制,以便我们构建易理解易搜索的URLS。这个路由机制提高了应用程序的可访问性,同时利于搜索引擎优化。
(九)三层架构与MVC架构的区别在哪?
三层架构是一个线性的架构,主要包括:展现层、业务逻辑层、数据访问层。用户直接与展现层交互。
MVC架构是一个三角形架构,将应用程序分成三个部分,Model、View、Controller。用户在View的帮助下与Controller交互。
MVC不会替换掉三层架构;往往三层架构与MVC是一起使用的,MVC扮演三层架构中的展现层。
(十)ASP.NET WebForm 与 ASP.NET MVC的区别是什么?
主要的区别详细见下表:
Web Forms | MVC |
---|---|
事件驱动开发模型 | 轻量级的基于MVC模型的开发模型 |
服务端控件 | Html Helper |
状态管理技术(View State、Session) | 没有自动的状态管理 |
基于文件路径的路由 | 基于路由的Urls |
遵循WebFrom语义 | 遵循Razor引擎语义 |
View与业务逻辑紧耦合(.aspx,.aspx.cs) | View与业务逻辑分离 |
通过Master Page(母板页)进行统一布局 | 使用Layout 统一布局 |
通过User Controls 进行重用 | 通过Partial View进行重用 |
有内置的数据控件,操作数据比较方便 | 轻量级的,提供全面的控制标记和支持许多功能,允许快速和敏捷发展。因此,它是最好的用最新的Web标准开发Web交互应用程序。 |
非开源 | 开源 |
二、ASP.NET MVC简单入门
1.1、MVC概念
视图(View)
代表用户交互界面,对于Web应用来说,可以概括为HTML界面,但有可能为XHTML、XML和Applet。
模型(Model)
表示用户对其数据的操作的一个封转。可以分为视图模型(view model)和领域模型(domain models),视图模型就是在视图与控制器之间传输数据的一个封转,而领域模型就是业务逻辑,后台数据模型等的一个集合。是我们学的3层中的BLL,DAL,Models的集合
控制器(Controller)
控制器可以理解为从用户接收请求,将模型与视图匹配在一起,共同完成用户的请求。
1.2、ASP.NET MVC 原理
当在浏览器中输入一个URL,进入了Route系统,路由系统得到URL各个片段的值,并交给MVC处理,MVC依据URL的信息知道请求的Action,接着就对模型进行一系列的处理,然后呈现视图。
MVC对控制器与View有一定的限制,但对模型没有任何的限制。
控制器必须实现IController接口或者继承Controller类,控制器类中的公有方法称之为Action Method。
1.3、MVC项目结构及含义
1.4、MVC命名习惯
在MVC项目中有2种习惯
a、建议你如何组织项目中的一些文件,比如js文件放在Scripts文件夹下,像这种习惯,你完全可以不遵循,这些文件夹和文件删除并不影响MVC框架本身。
b、另外一种,有个专门的术语:”Convention over configuration”,意思就是说如果你遵循了这个习惯就不需要进行额外的配置或编码(特别是控制器与视图)。这种习惯就尽量遵循,如果违反,在MVC中就需要做许多的事情。
主要有3个方面:
a、控制器命名习惯:控制器类必须以Controller结尾,但引用这个控制器的时候可以省略掉Controller,如果想改变这种行为,需要自己实现IControllerFactory接口,默认是通过DefaultControllerFactory来执行这个控制器的查找的。
b、视图命名习惯:视图或者分部视图应该放在/Views/Controllername文件夹下面,比如一个控制器为Demo 那么这个控制器的所有视图应该放在/Views/Demo/下面,默认情况下,每一个Action Method对应一个视图,尽
量让视图名字与Action名字一样,这样在Action中就可以直接return View();而放在Shared文件夹下面的视图所有的控制器都可以使用
c、布局命名习惯:布局文件都以下划线开头,并放置在shared文件夹下面,在MVC 3中默认每个视图都会用到_layout.cshtml布局,可以在_viewstart.cshtml看到这个设置
1.5、ASP.NET MVC优缺点
优点:
A、具有多个视图对应一个模型的能力。
B、由于一个应用被分离为三层,因此有时改变其中的一层就能满足应用的改变。一个应用的业务流程或者业务规则的改变只需改动MVC的模型层。
C、它还有利于软件工程化管理。由于不同的层各司其职,每一层不同的应用具有某些相同的特征,有利于通过工程化、工具化产生管理程序代码。
缺点:
A、增加了系统结构和实现的复杂性。
B、视图与控制器间的过于紧密的连接。
C、视图对模型数据的低效率访问。