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

最新文章

  1. redhat 配置本地yum源163yum源epel 源,无需卸载yum!无须拷贝ISO,愿网上少一点垃圾教程误人子弟
  2. BZOJ4643 : 卡常大水题
  3. OpenLDAP双主
  4. swift学习笔记之-类和结构体
  5. 使用数据库sqlite3 C语言实现登陆注册的功能
  6. 为PetaPoco添加实体模板
  7. Android框架
  8. SQL索引一步到位(此文章为“数据库性能优化二:数据库表优化”附属文章之一)
  9. Sharepoint中出现webpart部署之后却找不到的一种情况
  10. Swift数组的加法运算符用法:array1 += array2
  11. 点击UserControl中的按钮将值传给winform页面
  12. Java 加密解密 对称加密算法 非对称加密算法 MD5 BASE64 AES RSA
  13. JS七种加密解密方法
  14. 委托 delegate, 继承
  15. discuz用户登录不响应,提示nginx gateway timeout解决方法
  16. Java设计模式之(一)------单例模式
  17. js备战春招の四の表单
  18. POI操作excel中的日期格式处理
  19. Java类的继承与方法调用的一个小问题
  20. Ubuntu 14.04 安装caffe

热门文章

  1. Linux 文件描述符和重定向
  2. [备忘]删除SQL Server中无登录名的用户
  3. SQL—大话函数依赖与范式
  4. CGFloat Float 互转
  5. 实现两个MySQL数据库之间的主从同步
  6. 知方可补不足~Sqlserver发布订阅与sql事务的关系
  7. Android 在线SDK更新 和谐被墙解决
  8. AngularJS $http配置为form data 提交
  9. hibernate(一)第一个例子
  10. javascript运算符——条件、逗号、赋值、()和void运算符