控制器描述者(ControllerDescriptor),行为方法描述者(ActionDescriptor),参数描述者(ParameterDescriptor)的小结
Model的绑定是在Action方法绑定参数时发生的,这个绑定的参数过程要用到的元数据来自于控制器,行为方法和参数的描述者ContrllerDescriptor,ActionDescriptor和ParameterDescriptor。下面也是先来一幅类图,在蒋老师的图上再加了一些书中提到的一些类

主要由三个Descriptor分为上下两部分,下面则是蒋老师原来的那幅图,是各个Descriptor之间的关系,上部是我另外加上去的,是各个Descriptor在使用过程中会用到的一些Info类和Attribute特性类。而下面介绍的主要是介绍者为主,其他作为插花介绍。
ControllerDescriptor:用于描述Controller,作起元数据之用。它包含控制器名称ControllerName(这个由URL获得)及其类型Type,实现了ICustomAttribute接口可以获得Controller的Attribute特性,判断给定特性是否有用于当前控制器,尤其是判断Filter过滤器。但是这个由于这是抽象类,他返回的特性数组都是空的。
ReflectedControllerDescriptor:是ControllerDescriptor的继承,书上说它是唯一的继承,但是还有一个ReflectedAsyncDescriptor继承ControllerDescriptor类,不知和解,如果有哪位园友知道原因欢迎解疑,重写了基类ControllerDescriptor的所有抽象方法,让获取的特性数组不再是空数组。由于在里面使用了反射来获取Attribute,所以名称上会有ReflectedControllerDescriptor。
ReflectedAsyncControllerDescriptor:ReflectedControllerDescriptor的一个异步版本,它也是直接继承了ControllerDescriptor,是专门记录异步Controller的——AsyncController,里面FindAction和GetConnonActions定义与ReflectedControllerDescriptor的不一样,前者返回空的数组,后面的方法与XXXAsync/XXXCompleted命名模式的方法。
插花:
- FindAction通过反射方法名匹配Action名或ActionName特性获取ActionDescriptor;
- ActionNameAttribute与ActionMethodSelectorAttribute相似,后者用于执行Action方法时检验判定,两者用法一样,但用的场景不同。HttpGetAttribute、HttpPostAttribute等类与AcceptVerbsAttribute都是继承ActionMethodSelectorAttribute,但是HttpPostAttribute这部分类的内部都是调用了AcceptVerbsAttribute;
- 如果一个Controller里面的方法不希望是Action方法,可以用NonActionAttribute;
ActionDescriptor:用于描述Action方法元数据信息,ActionName和ControllerDescriptor一样实现了ICustomerAttribute,有获取下一级的方法GetParameters(),有属于它自身的用于Action方面的方法:1)ActionName;2)GetSelectors()总返回空数组,3)GetFilters()返回四种 Filter集合的类,4)Excute()
AsyncActionDescriptor:继承ActionDescriptor,但它也是一个抽象类,重写了Excute,因为这个是异步的类,Excuete是一个同步的方法,它不允许执行同步方法,于是就重写了这个方法,让它执行的时候抛出异常,他定义了BeginExcute/EndExcute方法,这是APM异步方法的标志了。
ReflectedActionDescriptor:继承了ActionDescriptor,ReflectedControllerDescriptor的GetAction返回的对象,重写了基类的所有抽象方法,ReflectedActionDescriptor与ReflectedControllerDescriptor同样情况,内部运用了反射而得名,
ReflectedAsyncActionDescriptor:继承了AsyncActionDescriptor,有AsyncControllerDescriptor提供,由于是非抽象类,重写了AsyncActionDescriptor基类的抽象方法,一个AsyncControllerDescriptor对象就表示一堆XXXAsync/XXXCompleted方法,但它只能描述AcyncController里面的Action。
TaskAsyncActionDescriptor:另一种异步方式,但与ReflectedAsyncActionDescriptor不一样,TaskAsyncActionDescriptor可以描述普通的Controller里面的Action方法,类的内部定义BeginExcute/EndExcute方法。
ParameterDescriptor:Model绑定的和兴,与ControllerDescriptor和ActionDescriptor一样,实现了ICustomer接口,对他实现了接口的方法,但情况还是跟他们一样,返回的只能是空数组。但里面的BindingInfo控制请求数据与参数绑定的行为。
ReflectedParameterDescriptor:继承ParameterDescriptor,具有ParameterInfo类型的同名属性。
插花:ParameterDescriptor的BindINfo返回ParameterBindingInfo对象,Binder属性返回的ModelBinder对象是Model绑定的核心,其余3个属性源于BindAttribute,BindAttribute的IsPropertyAllowed给出是否允许绑定。
控制器描述者(ControllerDescriptor),行为方法描述者(ActionDescriptor),参数描述者(ParameterDescriptor)的小结的更多相关文章
- Pthon魔术方法(Magic Methods)-描述器
Pthon魔术方法(Magic Methods)-描述器 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.描述器概述 1>.描述器定义 Python中,一个类实现了&quo ...
- 获取Enum枚举值描述的几法方法
原文:获取Enum枚举值描述的几法方法 1.定义枚举时直接用中文 由于VS对中文支持的很不错,所以很多程序员都采用了此方案. 缺点:1.不适合多语言 2.感觉不太完美,毕竟大部分程序员大部分代码都使用 ...
- DEDE内容页调用栏目的SEO标题、描述、关键字的方法
上篇写了<dedecms栏目页调用栏目关键词.描述的方法>,本章雨田SEOER讲述DEDE内容页调用栏目的SEO标题.描述.关键字的方法内容页调用SEO标题:在<title>& ...
- 定义一个接口CanFly,描述会飞的方法public void fly();
1.使用类与接口的知识完成如下要求:(1)定义一个接口CanFly,描述会飞的方法public void fly();(2)分别定义类飞机和鸟,实现CanFly接口.(3)定义一个测试类,测试飞机和鸟 ...
- struts.properties的参数描述
A.2.1 概述 如果我们希望覆盖在default.properties文件里面定义的默认配置,那就可以定义struts.properties文件,在里面设置我们需要的值,当然现在也可以在struts ...
- .NET MVC控制器分离到类库的方法
在.ASP.NET MVC的开发中,我们创建完项目之后,ASP.NET MVC是已Model-Controller-View的形式存在的,在创建项目自动生成的内容上Model我们很容易分离成类库,所以 ...
- 基于 Koa平台Node.js开发的KoaHub.js的控制器,模型,帮助方法自动加载
koahub-loader koahub-loader是基于 Koa平台Node.js开发的KoaHub.js的koahub-loader控制器,模型,帮助方法自动加载 koahub loader I ...
- 【转】.NET MVC控制器分离到类库的方法
在.ASP.NET MVC的开发中,我们创建完项目之后,ASP.NET MVC是已Model-Controller-View的形式存在的,在创建项目自动生成的内容上Model我们很容易分离成类库,所以 ...
- 2,Spring MVC 学习总结(二)- 方法(Action)参数映射
一,Controller层方法(Action)参数映射 1,自动参数映射 1.1,基本数据类型参数映射 方法的参数可以是任意基本数据类型,如果方法参数名与http中请求的参数名称相同时会进行自动映射. ...
随机推荐
- Powershell--批量拆分SQL语句为事务并批处理
作为DBA,时不时会遇到将数据导入到数据库的情况,假设业务或研发提供一个包含上百万行INSERT语句的脚本文件,而且这些INSERT 语句没有使用GO来进行批处理拆分,那么直接使用SQLCMD来执行会 ...
- 手把手教你用python打造网易公开课视频下载软件2-编码相关说明
函数getdownLoadInfo(url)主要实现核心功能:根据url地址,获取课程信息:课程名(courseTitle),课程数目(courseCount),可下载视频数目(videoCount) ...
- C#中使用反射获取结构体实例
一般用反射获取类对象的实例比较简单,只要类有一个无参构造函数或没有显示声明带参的构造函数即可使用如下代码 static void Main(string[] args) { Type type = t ...
- Dynamics CRM 2013 installation
原创地址:http://www.cnblogs.com/jfzhu/p/3445820.html 转载请注明出处 一 硬件要求 1. CRM Server 下表对硬件的要求是假定Microsoft S ...
- 机械革命 USB装系统各种坑
买了个号称超强性价比的游戏本- 机械革命, i7+ssd+hd+4G RAM+ GTX850M, 很直接, 直接出厂就一个DOS系统,回来要自己装机. 好吧, 先下了个大白菜软件,用来刻录ISO系统到 ...
- Redis学习笔记~常用命令总结
回到目录 客户端redis-cli常用的命令总结 连接到服务器 redis-cli -h 127.0.0.1 -p 6379 --连接指定的redis服务器 发布/订阅, pub/sub模式运行在re ...
- 知方可补不足~SQL中的count命令的一些优化措施(百万以上数据明显)
回到目录 SQL中对于求表记录总数的有count这个聚合命令,这个命令给我们感觉就是快,比一般的查询要快,但是,当你的数据表记录比较多时,如百万条,千万条时,对于count来说,就不是那么快了,我们需 ...
- 如何使用ITEXTSHARP将HTML代码字符串写进PDF
原文 如何使用ITEXTSHARP将HTML代码字符串写进PDF itextsharp包括一个简单的类,可以用来根据html代码或字符串创建pdf文件.使用此类,你可以使用短短几行代码,就将 HTML ...
- 【技巧】只利用 Visual Stdio 自带的工具这么找父类?
很多人说只能 F12 看见子类 其实vs里面有一个叫“对象浏览器” 通过这个就可以直接定位父类,不需要利用reflector之类的工具来找父类 具体如下:
- Android入门(二十)HttpURLConnection与HttpClient
原文链接:http://www.orlion.ga/679/ 在 Android上发送 HTTP请求的方式一般有两种,HttpURLConnection和 HttpClient. 一.HttpURLC ...