控制器描述者(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中请求的参数名称相同时会进行自动映射. ...
随机推荐
- jQuery的动画处理总结
最近一年多一直在做前端的东西,由于老板在追求一些年轻动感的效果,让页面元素不能仅仅是简单的隐藏显示,所以经常会使用一些动画效果,发现jQuery的动画真心好用啊,把常用的几个总结一下,希望不再每次使用 ...
- 在 Win10 命令行使用 Consolas + 微软雅黑
这个过程挺神奇的,步骤参考了下面两篇文章,但是过程很曲折: 1. 使用Monaco和微软雅黑字体美化cmd和PowerShell 2. [zz]Windows的cmd.exe使用consolas加中文 ...
- Senparc.Weixin.MP SDK 微信公众平台开发教程(五):使用Senparc.Weixin.MP SDK
Senparc.Weixin.MP SDK已经涵盖了微信6.x的所有公共API. 整个项目的源代码以及已经编译好的程序集可以在这个项目中获取到:https://github.com/JeffreySu ...
- Git学习笔记(9)——自定义配置
本文主要记录了Git的一些易用化的配置和别名的使用 配置Git的命令输出带有颜色,更加醒目 //配置输出颜色 $ git config --global color.ui true //取消输出颜色 ...
- AI-随机迷宫&迷宫求解
本文记录了,人工智能中简单的搜索策略中的路径搜索策略中的A*算法,来实现迷宫寻路的问题.(这只是一次本人的课外作业) 完整的程序源码已经发送到我的Git.这里只记录了我的思路和感想以及收获. 产生随机 ...
- SQL-truncate && delete && drop 的区别
有些人在删除表的所有记录的时候,喜欢这样来——不给DELETE 语句提供WHERE 子句,表中的所有记录都将被删除.但这种方法是不可取的,正确的应该使用 TRUNCATE TABLE tb_name ...
- How to fix updating ubuntu apt-get problem
It's my new PC with a new os of ubuntu. every time when I want to install software or update apt-get ...
- swift tableview的分割线不能到头
1,设置tableview的separatorInset, layoutMargins if(myTableView.respondsToSelector("setSeparatorInse ...
- CGFloat Float 互转
直接上代码吧 var positionX:CGFloat = 10 var positionY:CGFloat = 20 var tmpX:Float = 30 var tmpY:Float = 40 ...
- Atitit rgb yuv hsv HSL 模式和 HSV(HSB) 图像色彩空间的区别
Atitit rgb yuv hsv HSL 模式和 HSV(HSB) 图像色彩空间的区别 1.1. 色彩的三要素 -- 色相.明度.纯度1 1.2. YUV三个字母中,其中"Y&quo ...