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)的小结的更多相关文章

  1. Pthon魔术方法(Magic Methods)-描述器

    Pthon魔术方法(Magic Methods)-描述器 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.描述器概述 1>.描述器定义 Python中,一个类实现了&quo ...

  2. 获取Enum枚举值描述的几法方法

    原文:获取Enum枚举值描述的几法方法 1.定义枚举时直接用中文 由于VS对中文支持的很不错,所以很多程序员都采用了此方案. 缺点:1.不适合多语言 2.感觉不太完美,毕竟大部分程序员大部分代码都使用 ...

  3. DEDE内容页调用栏目的SEO标题、描述、关键字的方法

    上篇写了<dedecms栏目页调用栏目关键词.描述的方法>,本章雨田SEOER讲述DEDE内容页调用栏目的SEO标题.描述.关键字的方法内容页调用SEO标题:在<title>& ...

  4. 定义一个接口CanFly,描述会飞的方法public void fly();

    1.使用类与接口的知识完成如下要求:(1)定义一个接口CanFly,描述会飞的方法public void fly();(2)分别定义类飞机和鸟,实现CanFly接口.(3)定义一个测试类,测试飞机和鸟 ...

  5. struts.properties的参数描述

    A.2.1 概述 如果我们希望覆盖在default.properties文件里面定义的默认配置,那就可以定义struts.properties文件,在里面设置我们需要的值,当然现在也可以在struts ...

  6. .NET MVC控制器分离到类库的方法

    在.ASP.NET MVC的开发中,我们创建完项目之后,ASP.NET MVC是已Model-Controller-View的形式存在的,在创建项目自动生成的内容上Model我们很容易分离成类库,所以 ...

  7. 基于 Koa平台Node.js开发的KoaHub.js的控制器,模型,帮助方法自动加载

    koahub-loader koahub-loader是基于 Koa平台Node.js开发的KoaHub.js的koahub-loader控制器,模型,帮助方法自动加载 koahub loader I ...

  8. 【转】.NET MVC控制器分离到类库的方法

    在.ASP.NET MVC的开发中,我们创建完项目之后,ASP.NET MVC是已Model-Controller-View的形式存在的,在创建项目自动生成的内容上Model我们很容易分离成类库,所以 ...

  9. 2,Spring MVC 学习总结(二)- 方法(Action)参数映射

    一,Controller层方法(Action)参数映射 1,自动参数映射 1.1,基本数据类型参数映射 方法的参数可以是任意基本数据类型,如果方法参数名与http中请求的参数名称相同时会进行自动映射. ...

随机推荐

  1. java提高篇(十八)-----数组之一:认识JAVA数组

          噢,它明白了,河水既没有牛伯伯说的那么浅,也没有小松鼠说的那么深,只有自己亲自试过才知道!道听途说永远只能看到表明现象,只有亲自试过了,才知道它的深浅!!!!! 一.什么是数组      ...

  2. 使用MYSQL命令直接导入导出SQL文件

    很多时候,我们的数据开发都会用到很多开发利器,比如powerdesigner, navicat等这些软件,虽然好用,但是要收费,在公司里面是禁止使用盗版软件的,怕罚款各方面的,所以我们也不敢直接在公司 ...

  3. java内功 ---- jvm虚拟机原理总结,侧重于GC

    写作日期 2016-08-22-23 交流qq:992591601 参考资料:<深入理解java虚拟机>.<thinking in java>.<Effective Ja ...

  4. 微软官网下载windows系统有点全

    第一步:访问:https://www.microsoft.com/zh-cn/software-download/windows10ISO/ 默认就只能下载win10,这怎么行呢.巨硬程序员貌似没做服 ...

  5. http 各个状态码及对应的java 编程

    http的状态? 200 301 302 400 404 500 501 等等 如何编码? 其实这个是web服务器的范畴.服务器处理各个请求的时候,如果正常, 自然就是200 http://www.c ...

  6. iOS xcode6 设置多语言

    1,首先新建一个文件,选中ios模块下Rescource的Strings File 类型.eg:文件 2,选中该文件,右边栏选该文件属性,选中Localizable模块,选中localiz,这时会弹出 ...

  7. Atitit Immutability 和final的优点

    Atitit Immutability 和final的优点 什么是 immutability? 其实细分起来有语法上的 immutable (例如 Java 里的 final 关键字), 和运行时对象 ...

  8. WPF入门教程系列十——布局之Border与ViewBox(五)

    九. Border Border 是一个装饰的控件,此控件绘制边框及背景,在 Border 中只能有一个子控件,若要显示多个子控件,需要将一个附加的 Panel 控件放置在父 Border 中.然后可 ...

  9. 学习ASP.NET MVC(九)——“Code First Migrations ”工具使用示例

    在上一篇文章中,我们学习了如何使用实体框架的“Code First Migrations ”工具,使用其中的“迁移”功能对模型类进行一些修改,同时同步更新对应数据库的表结构. 在本文章中,我们将使用“ ...

  10. 项目中是用eCharts

    1.首先在项目中引入echart.js库. <!DOCTYPE HTML> <%@page contentType="text/html; charset=UTF-8&qu ...