控制器,行为方法,参数三者的描述者小结

  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给出是否允许绑定。

时间: 2024-10-18 07:38:37

控制器,行为方法,参数三者的描述者小结的相关文章

关于laravel5.5控制器方法参数依赖注入原理深度解析及问题修复

在laravel5.5中,可以根据控制器方法的参数类型,自动注入一个实例化对象,极大提升了编程的效率,但是相比较与Java的SpringMVC框架,功能还是有所欠缺,使用起来还是不太方便,主要体现在方法参数的注入不完全是按照参数名称进行的,如果改变了传入参数的顺序会导致类型不匹配的错误. 一.控制器方法参数注入步骤设计 1.在/routes/web.php中添加路由 Route::get('/diary/show/{diary}/{page?}','Diary\[email protected]

JQuery中$.ajax()方法参数详解

url: 要求为String类型的参数,(默认为当前页地址)发送请求的地址. type: 要求为String类型的参数,请求方式(post或get)默认为get.注意其他http请求方法,例如put和 delete也可以使用,但仅部分浏览器支持. timeout: 要求为Number类型的参数,设置请求超时时间(毫秒).此设置将覆盖$.ajaxSetup()方法的全局设 置. async:要求为Boolean类型的参数,默认设置为true,所有请求均为异步请求. 如果需要发送同步请求,请将此选项

ajax方法参数

jquery中的ajax方法参数总是记不住,这里记录一下. 1.url: 要求为String类型的参数,(默认为当前页地址)发送请求的地址. 2.type: 要求为String类型的参数,请求方式(post或get)默认为get.注意其他http请求方法,例如put和delete也可以使用,但仅部分浏览器支持. 3.timeout: 要求为Number类型的参数,设置请求超时时间(毫秒).此设置将覆盖$.ajaxSetup()方法的全局设置. 4.async: 要求为Boolean类型的参数,默

jQuery中$.ajax()方法参数解析

本文实例为大家讲解了jQuery $.ajax()方法参数,供大家参考,具体内容如下 $.ajax({ url:'test.do', data:{id:123,name:'xiaoming'}, type:'post', dataType:'json', success:function(data){ alert(data);//弹窗 //TODO ........ }, error:function(data){ alert(data);//弹窗 //TODO ........ } }) ur

$.ajax()方法参数详解

url: 要求为String类型的参数,(默认为当前页地址)发送请求的地址. type: 要求为String类型的参数,请求方式(post或get)默认为get.注意其他http请求方法,例如put和 delete也可以使用,但仅部分浏览器支持. timeout: 要求为Number类型的参数,设置请求超时时间(毫秒).此设置将覆盖$.ajaxSetup()方法的全局设 置. async:要求为Boolean类型的参数,默认设置为true,所有请求均为异步请求. 如果需要发送同步请求,请将此选项

JQuery中$.ajax()方法参数

url: 要求为String类型的参数,(默认为当前页地址)发送请求的地址. type: 要求为String类型的参数,请求方式(post或get)默认为get.注意其他http请求方法,例如put和 delete也可以使用,但仅部分浏览器支持. timeout: 要求为Number类型的参数,设置请求超时时间(毫秒).此设置将覆盖$.ajaxSetup()方法的全局设 置. async:要求为Boolean类型的参数,默认设置为true,所有请求均为异步请求. 如果需要发送同步请求,请将此选项

navtab方法参数以及事件

参数(options) DOM方式初始化navtab的,推荐使用集合属性data-options定义参数,如果使用data属性定义参数,注意转换成对应的名称. 名称 类型 默认值 描述 id string undefined [必选]标签的ID,如果指定重复,将覆盖现有ID相同标签 title string New tab [可选]标签打开后显示的名称 url string undefined [可选]D-Url 请求数据的url,a链接触发时可以将url定义在href属性 external b

cmstop传递什么控制器和方法---就实例化该控制器

object顶级类class object 第一级抽象类controllerabstract class controller extends object 第二级抽象类controller_abstract 继承controller 祖父类 abstract class controller_abstract extends controller cmstop.php主程序 设置属性public $app, $controller, $action用来接收并保存当前请求的模块,控制器,和方法实

结合公司的框架解决MVC的分离问题、【公司的入口和解决路由分发功能(url转为控制器和方法的使用)】

1.面向对象的语法需要进行一次比较细节的总结 [到面向对象之后完成了基础语法的复习] 2.ecshop做电商的网站[模拟这个框架] 安装ecshop中的upload包[进行配置:注意gd和mysql] 安装成功之后ecshop并不兼容php-5.4以上的版本,报错太多 [现在需要考虑的是做一套系统实现] [另外需要参考多个框架和项目(成型的系统二次开发)了解业务和思想] [重点] 3.设计一个框架[MVC框架思维] (1)框架设计中的第一条思路 首先实现逻辑和显示的分离[因为php本身是嵌入式的