MVC中的M、V和C

MVC的缩写来自Model-View-Controller模式,作用是组织项目结构。用于将不同的事情独立开来,区分20世纪70年代另一种Page-Controller模式。

其实MVC是一个框架,而不是实现方式,很多人会因为它的名字误解MVC不就是Model,View,Controller的组合体吗,为什么说是一个框架,但还需要写那么多实现。这里我也打个问号,边看边来回答。

在ASP.NET Core MVC框架中,它有一套完整并持续不断发展的类库和工具,帮助开发者创建很棒的应用程序。

1.深入了解模型-Model

模型是描述用户界面上需要渲染的数据,或是这些数据的一部分。这里要区分实体和模型的概念,Entity-实体,是业务逻辑中使用的数据结构,一般与数据库中对应的表一致。

如果把实体简单直接的显示在界面上的话,会出现:

数据冗余,视图与后端业务逻辑和数据库耦合度高,过多的业务逻辑相关的属性都会出现在用户界面中。

不安全,过度绑定问题,类似UserID之类的数据库中唯一性的属性会被前端页面攻击

所以使用ViewModel-视图模型,把数据处理成视图所需要的模型来渲染数据。

2.视图-View

视图就是直译的前端页面,只是这个HTML页面包括了数据模型,ASP.NET Core MVC中使用Razor视图引擎和语法来处理代码流、访问数据模型和服务,以及生产HTML所需的标记。

局部视图

设计模式原则-DRY(Don't Repeat Yourself)可以使用局部视图来创建组件,使用在各个页面中。局部视图不是直接渲染的,而是项目中其他视图的组成部分,好像可以实现异步渲染?

3.控制器-Controller

控制器就像是MVC应用程序中的交警,确保正确的类型和数据正确地相互传递。控制器是一个容器,其中包含一组相关的输入处理程序-handler。这些处理程序被称为操作-action,它在控制器中以方法method的形式实现。每个方法或者操作,可以接收零个或多个参数,如果输入参数包含了相应数据的话,这些数据在执行流水线的模型绑定阶段自动进行填充,并转换为相应的参数。

控制器的最主要的职责是,处理请求,校验输入参数,创建一个相应的输出响应。有时需要处理一个模型类的实例,或者创建一个特定HTTP状态码的响应。

在控制器中,开发者要避免任何业务逻辑的代码,业务逻辑应该是模型层或其他组件负责的事情(服务-Service,通过DI创建)。同时,也不要在操作中直接进行数据访问或者外部调用,这些是服务层应该做的事情。下图展示了这个结构。

.net mvc 架构图 .net mvc core_MVC

MVC中的其他组件

在解决方案中,其实远不止模型、视图和控制器。下面其他组件的介绍

1.中间件

ASP.NET Core MVC 几乎全是由中间件组成的,在Startup类中,即应用程序启动开始的时候,可以在Configure方法中配置Core MVC框架的中间件。中间件就是传统ASP.NET中的HTTP模块和HTTP处理程序模块,中间件使用一个通用的方式同时取代了这两者,使得实现起来更容易。

下面的内置的中间件:

诊断:提供了异常处理、运行时辅助功能(比如向开发者提供数据库错误页以及详细的执行技术信息等)

静态文件:允许在请求管道中进行短路操作,直接从磁盘上返回一个文件

身份验证:允许应用程序保护其终结点和资源

路由:根据输入的路径和参数,决定应该执行哪个控制器的哪个操作

CORS:在header中注入跨域共享资源的相关信息

MVC本身:通常都是在中间件管道的最后一个环节,用来处理请求

下图是不同请求如何被中间件处理的示意图:

.net mvc 架构图 .net mvc core_MVC_02

2.依赖注入

3.其他-配置和日志,Tag Helper,身份

上述两点在后面单独介绍

总结:

MVC就是一个框架,而ASP.NET Core MVC则是微软基于MVC思想创建的一个.NET Core框架,作为应用程序核心的model,view,contrller只是框架中的一小部分。