ASP.NET MVC 描述类型(一)
ASP.NET MVC 描述类型(一)
前言
在前面的好多篇幅中都有提到过ControllerDescriptor类型,并且在ASP.NET MVC 过滤器(一)篇幅中简单的描述过,今天我们就来讲一下ControllerDescriptor类型。
ControllerDescriptor类型的由来
在ASP.NET MVC 过滤器(一)篇幅中有过示意图,当时说明了在生成过滤器信息对象集合之前所要做的一些步骤中包含着生成ControllerDescriptor类型,并没有详细的说明,我们先来看一下图1
图1

关于这个示意图之前的一些部分我就不细说了,我们就先看一下ControllerDescriptor类型的生成过程;
从图1中可以看出ControllerDescriptor类型的由来是由ControllerDescriptorCache控制器描述类型缓存类【系统默认实现类】来生成的,ControllerDescriptorCache类型也是实现了ReaderWriterCache<Type, ControllerDescriptor>类型的,这里只要描述一下ReaderWriterCache<Type, ControllerDescriptor>类型中的实现就好了,因为ControllerDescriptorCache也只是调用了基类的某个函数来实现生成的功能。来说实现,ReaderWriterCache<Type, ControllerDescriptor>中有个键值队类型的缓存变量【下文中都用缓存一词代替】,用来存贮控制器描述类型的,实现方法的签名和ControllerDescriptorCache的GetDescriptor()方法一样,第一个参数是会根据当前ControllerContext中的Controller来获取当前控制器的类型,第二个参数暂且不谈稍后讲解现在只要把第二个参数是当成生成ControllerDescriptor类型的外插模块,在实现中,首先会根据ControllerType去缓存中查找,如果有的话则返回查找到的控制器描述类型,没有的话,则会根据第二个参数来生成控制器描述类型,然后会先把生成的控制器描述类型设置到缓存中再返回生成的类型。
看到这里有的朋友会问说来说去也没说重点,ControllerDescriptor类型到底怎么来的,对的,重点在于第二个参数,上面的描述只是让大家更清晰的认识到Func<ControllerDescriptor>的重要性。
看一下系统的默认实现Func<ControllerDescriptor>的方式: () => new ReflectedControllerDescriptor(controllerType),controllerType类型是从当前ControllerContext.Controller.GetType()获取的。
对于ReflectedControllerDescriptor类型,在默认实现中都是把它作为ControllerDescriptor类型类使用的。
这个时候我们看一下ControllerDescriptor类型的定义,示例代码1-1.
代码1-1
public abstract class ControllerDescriptor : ICustomAttributeProvider, IUniquelyIdentifiable
{ protected ControllerDescriptor(); // 摘要:
// 获取控制器的名称。
//
// 返回结果:
// 控制器的名称。
public virtual string ControllerName { get; }
//
// 摘要:
// 获取控制器的类型。
//
// 返回结果:
// 控制器的类型。
public abstract Type ControllerType { get; }
public virtual string UniqueId { get; } // 摘要:
// 使用指定的名称和控制器上下文来查找操作方法。
//
// 参数:
// controllerContext:
// 控制器上下文。
//
// actionName:
// 操作的名称。
//
// 返回结果:
// 有关操作方法的信息。
public abstract ActionDescriptor FindAction(ControllerContext controllerContext, string actionName);
//
// 摘要:
// 在控制器中检索操作-方法描述符的列表。
//
// 返回结果:
// 控制器中的操作-方法描述符的列表。
public abstract ActionDescriptor[] GetCanonicalActions();
public virtual object[] GetCustomAttributes(bool inherit);
public virtual object[] GetCustomAttributes(Type attributeType, bool inherit);
public virtual bool IsDefined(Type attributeType, bool inherit);
}
在代码1-1中,大家也都是看到了ControllerDescriptor类型的定义是抽象类型,其中ControllerName属性表示着当前控制器上下文中的控制器名称,ControllerType属性是被定义为抽象的了,需要在派生类中的实现的(ReflectedControllerDescriptor类型),FindAction()也是抽象的,看这个方法的返回类型就知道了它是做什么用的了,对于这部分的细节都是在默认实现类ReflectedControllerDescriptor类型中表示,来看ReflectedControllerDescriptor类型的定义,示例代码1-2
代码1-2
public class ReflectedControllerDescriptor : ControllerDescriptor
{
//
// 参数:
// controllerType:
// 控制器的类型。
//
// 异常:
// System.ArgumentNullException:
// controllerType 参数为 null。
public ReflectedControllerDescriptor(Type controllerType);
public override sealed Type ControllerType { get; }
public override ActionDescriptor FindAction(ControllerContext controllerContext, string actionName);
public override ActionDescriptor[] GetCanonicalActions();
public override object[] GetCustomAttributes(bool inherit);
public override object[] GetCustomAttributes(Type attributeType, bool inherit);
public override bool IsDefined(Type attributeType, bool inherit);
}
对于ReflectedControllerDescriptor类型的具体实现,在这里只是简要的说明一下,ReflectedControllerDescriptor类型的构造函数参数为Type类型,这里上面也说过这是Controller类型,在构造函数构造的时候,ReflectedControllerDescriptor类型内部还有个ActionMethodSelector类型的私有变量,ActionMethodSelector类型的构造函数所需参数也是Type类型。这里为什么要说到ActionMethodSelector类型呢?因为在ReflectedControllerDescriptor类型的FindAction()方法的具体实现中使用的就是ActionMethodSelector类型中的方法。就如图1所示的那样。
作者:金源
出处:http://www.cnblogs.com/jin-yuan/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面
ASP.NET MVC 描述类型(一)的更多相关文章
- ASP.NET MVC 描述类型(二)
ASP.NET MVC 描述类型(二) 前言 上个篇幅中说到ControllerDescriptor类型的由来过程,对于ControllerDescriptor类型来言ActionDescriptor ...
- Asp.Net Mvc 返回类型总结
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.We ...
- ASP.NET MVC 枚举类型转LIST CONTROL控件
在实际应用中,我们经常会用到下拉框.多选.单选等类似的控件,我们可以统称他们为List Control,他们可以说都是一种类型的控件,相同之处都是由一个或一组键值对的形式的数据进行绑定渲染而成的. 这 ...
- 使用Newtonsoft.json 解决 Asp.Net MVC DateTime类型数据Json格式化问题
解决思路 众所周知,MVC中调用的微软的组件JavaScriptSerialer...,格式DateTime类型数据需要在客户端专门解. 还知道,NewtonSoft.json可以“正确”的格式化Da ...
- asp.net MVC 枚举类型的处理的几种方式
枚举类型本质上是int类型,整型,这是非常重要的一点. 可以使用(int)将它强制转换为 整形.如果要使用MVC5提供的新辅助方法@Html.EnumDropDownListFor()方法,就必须将枚 ...
- ASP.NET MVC 系列随笔汇总[未完待续……]
ASP.NET MVC 系列随笔汇总[未完待续……] 为了方便大家浏览所以整理一下,有的系列篇幅中不是很全面以后会慢慢的补全的. 学前篇之: ASP.NET MVC学前篇之扩展方法.链式编程 ASP. ...
- 让ASP.NET MVC不使用jsonp也可以跨域访问
跨域问题仅仅发生在Javascript发起AJAX调用,或者Silverlight发起服务调用时,其根本原因是因为浏览器对于这两种请求,所给予的权限是较低的,通常只允许调用本域中的资源,除非目标服务器 ...
- ASP.NET MVC学习之模型模板篇
一.前言 如果你使用ASP.NET MVC制作后台一定会爱上它的EditorForModal.DisplayForModal和LabelForModal方法,因为这些方法可以将模型直接变成对应的标签, ...
- asp.net mvc CodeFirst模式数据库迁移步骤
利用Code First模式构建好基本的类后,项目也开始搭建完毕并成功运行,而且已经将数据库表结构自动生成了. 但是,我有新的类要加入,有字段需要修改,那怎么办呢,删库,跑路 ? 哈哈 利用数据库迁 ...
随机推荐
- 【开源】简单4步搞定QQ登录,无需什么代码功底【无语言界限】
说17号发超简单的教程就17号,qq核审通过后就封装了这个,现在放出来~~ 这个是我封装的一个开源项目:https://github.com/dunitian/LoTQQLogin ————————— ...
- Python列表去重
标题有语病,其实是这样的: 假设有两个列表 : L1 = [1,2,3,4] ; L2 = [1,2,5,6] 然后去掉L1中包含的L2的元素 直接这样当然是不行的: def removeExists ...
- Android Ormlite 学习笔记1 -- 基础
Ormlite 是一个开源Java数据实体映射框架.其中依赖2个核心类库: 1.ormlite-android-4.48.jar 2.ormlite-core-4.48.jar 新建项目,引用上面2个 ...
- JS继承之原型继承
许多OO语言都支持两种继承方式:接口继承和实现继承.接口继承只继承方法签名,而实现继承则继承实际的方法.如前所述,由于函数没有签名,在ECMAScript中无法实现接口继承.ECMAScript只支 ...
- Spark踩坑记——数据库(Hbase+Mysql)
[TOC] 前言 在使用Spark Streaming的过程中对于计算产生结果的进行持久化时,我们往往需要操作数据库,去统计或者改变一些值.最近一个实时消费者处理任务,在使用spark streami ...
- C#委托异步调用
参考页面: http://www.yuanjiaocheng.net/webapi/mvc-consume-webapi-get.html http://www.yuanjiaocheng.net/w ...
- MongoDB常用操作--集合1
1.创建集合有两种方式,显示创建和隐式创建 显示创建可以使用命令 db.createCollection("集合名称") 隐式创建可以使用命令 db.集合名称.insert({}) ...
- Python学习基础
1.使用范围: 大数据 .图像处理.web .运维.爬虫.自动化.科学计算 2.准备环境: linux/mac python 3.5.2 ipython vim/sublime/atom 3.列表 3 ...
- CYQ.Data V5 分布式缓存Redis应用开发及实现算法原理介绍
前言: 自从CYQ.Data框架出了数据库读写分离.分布式缓存MemCache.自动缓存等大功能之后,就进入了频繁的细节打磨优化阶段. 从以下的更新列表就可以看出来了,3个月更新了100条次功能: 3 ...
- CYQ.Data V5 从入门到放弃ORM系列:教程 - MAction类使用
背景: 随着V5框架使用者的快速增加,终于促使我开始对整个框架编写完整的Demo. 上周大概花了一星期的时间,每天写到夜里3点半,终完成了框架所有功能的Demo. 同时,按V5框架名称空间的顺序,对每 ...