MVC5-9 今天讲三个Descriptor
ControllerDescriptor、ActionDescriptor、ParmaterDescriptor
看名字一脸懵逼,这是做什么的呢?可别小看它们,它们在MVC中扮演着尤为重要的角色。
思考 ,我们在MVC中可以用各种好用的预定义特性(attribute)来实现很棒的功能,例如HttpPost、HttpGet这样的特性,但是基础好的同学一定明白attribute本身不会做什么,而是我们在背后对它做了什么。背后的故事,就在这三个类里了
其实说是这三个类也不太准确,因为它们都是抽象类,而实现它们的则是真正故事中的主角 ReflectedActionDescriptor、ReflectedControllerDescriptor、ReflectedParmaterDescriptor
深入浅出
我们需要做一些准备工作,因为后面内容可能会有点的绕,但是我们掌握住管道流的核心,就没有问题了。
一个请求被IIS转发到应用程序 ,后面会经历这样一个流程。可以看到激活Controller后会执行BeginExecuteCore方法,而在这个方法里会调用BeginInvokeAction就会进行检查我们的特性。
UrlrouringModel—>MvcHandler—>ControllerFactory(Controller)—>ActionInvoke(BeginInvokeAction)—>Controller[FindAction]检查特性 || Action 检查特性 || Parmater 检查特性 –> ActionInvoke 执行action
我在上面加了一些特性。下面开始进行调试验证
印证了上面的流程,现在激活了Controller开始进入BeginExecuteCore,下面我们进行这个方法里看看
现在已经进入了BeginExecuteCore,在这里要执行AsyncControllerActionInvoker的BeginInvokeAction方法,一切都和上面的流程一样,现在我们进入这个方法再去看一看
现在已经看到了ControllerDescriptor和ActionDescriptor
在不停的F11后会进入一个IsValidMethodSelector方法,在这里就是对action的attribute的方法了,方法里循环遍历了特性集合进行循环验证,
如果验证失败会是什么情况? 会返回一个ActionNotFound请看下面两张图
上面的验证过了后会继续进行pramater的验证与绑定,这个方法就是了。
最后就结束了,可能真的很乱,希望大家在看博文的同时可以进行调试对比,在最后的几个验证最好是逐语句,同时多看看调用堆栈。最后其实要说其实有一些走的都是异步版本的Descriptor,比如 ReflectedAsyncControllerDescriptor
MVC5-9 今天讲三个Descriptor的更多相关文章
- MVC5控制器传值的三种方式(ViewData,ViewBag,TempData),刚刚学习MVC5的新手,希望各位大神多多指教
mvc传值的三种方式:1.ViewData 在使用过程中需要类型转换 例子: ViewData["MyTitle"]="ViewData传值"; 引用: @Vi ...
- asp.net mvc5 step by step(三)—— Entity Framework Database First
一.先建数据库. 打开,SQL Server Management 新建数据库Employee 并新建表 /****** Object: Table [dbo].[t_Employee] Script ...
- mybatis精讲(三)--标签及TypeHandler使用
目录 话引 XML配置标签 概览 properties 子标签property resource 程序注入 settings 别名 TypeHandler 自定义TypeHandler EnumTyp ...
- ASP.NET + MVC5 入门完整教程三 (下) ---MVC 松耦合
建立松耦合组件 MVC 模式最重要的特性之一视他支持关注分离,希望应用程序中的组件尽可能独立,只有很少的几个可控依赖项.在理想的情况下,每个组件都不了解其他组件,而只是通过抽象接口来处理应用程序的其他 ...
- vector详讲(三)实例
移动语义: push语句有时候会通过移动语义来提高性能 #include <iostream> #include <vector> class Element { public ...
- 视觉SLAM十四讲(三)——三维空间刚体运动(下)
理论部分请看 :三维空间刚体运动 一.Eigen的使用 首先安装 Eigen: sudo apt-get install libeigen3-dev 一般都安装在 /usr/include/eigen ...
- ASP.NET + MVC5 入门完整教程三 (上) ---第一个MVC项目
https://blog.csdn.net/qq_21419015/article/details/80420815 第一个MVC应用程序 1创建MVC项目 打开VS ,File--新建--项目,选择 ...
- 【第三篇】ASP.NET MVC快速入门之安全策略(MVC5+EF6)
目录 [第一篇]ASP.NET MVC快速入门之数据库操作(MVC5+EF6) [第二篇]ASP.NET MVC快速入门之数据注解(MVC5+EF6) [第三篇]ASP.NET MVC快速入门之安全策 ...
- 三天讲透SpringBoot-初识基础使用
这次我们来说一下我们的SpringBoot,现在SpringBoot已经成为趋势,在我这里我用三篇文章的形式来讲清楚我们的SpringBoot,大致分为,第一篇讲搭建,基本使用,第二篇三方集成,自动装 ...
随机推荐
- TinyFrame升级之七:重构Repository和Unit Of Work
首先,重构的想法来源于以下文章:Correct use of Repository and Unit Of Work patterns in ASP.NET MVC,因为我发现在我的框架中,对Unit ...
- SQL 性能调优日常积累
我们要做到不但会写SQL,还要做到写出性能优良的SQL,以下为笔者学习.摘录.并汇总部分资料与大家分享! (1)选择最有效率的表名顺序(只在基于规则的优化器中有效) ORACLE 的解析器按照从右到左 ...
- HoloLens开发手记 - Unity development overview 使用Unity开发概述
Unity Technical Preview for HoloLens最新发行版为:Beta 24,发布于 09/07/2016 开始使用Unity开发HoloLens应用之前,确保你已经安装好了必 ...
- <实训|第十天>从底层解释一下U盘内存为什么变小的原因附数据恢复的基本原理
[root@localhost~]#序言 我们平时不论是买一个U盘硬盘,或者自己在电脑上创建一个分区,大小总是比我们创建的要小一点,有些人会说,这个正常啊,是因为厂家规定的1M=1000k,真正的是1 ...
- C程序两则
<span style="font-size:24px;">#include<iostream> using namespace std; int *fun ...
- jqMobile中pageinit,pagecreate,pageshow等函数的执行顺序
常见的共有5个page函数,刚开始有点迷糊的是到底谁先谁后执行. 实验告诉我们结果: var temp = ''; $('body').live('pagechange', function () { ...
- Bete冲刺第五阶段
Bete冲刺第五阶段 今日工作: web: 今日做的最大的工作是成功顺利的吧web部署到阿里云服务器上了,代码顺利在公网上跑,解决了与ios的网络连接问题.同时优化了几个接口的查询逻辑,减少了对数据库 ...
- PHP ElasticSearch的使用
系统是Windows server 2003. ElasticSearch是一个基于Lucene的稳定的.分布式.RESTFul的搜索引擎.其实所谓的RestFul就是它提供URL供你调用(建立索引和 ...
- [转]关于jquery中html()、text()、val()的区别
原文地址:http://www.cnblogs.com/xiaolifeidao/p/3715830.html .html()用为读取和修改元素的HTML标签 对应js中的innerHTML . ...
- CentOS 6.5升级Python和安装IPython(亲测可用)
python的升级(2.6------>2.7.x) 如下地址:http://note.youdao.com/share/?id=2928aeda020123bfdf2a2c76bc75e4a7 ...