内容概览
本篇主要探讨“Action”的创建过程,为什么要加引号呢?因为我们创建的不 是真正的Action,方法是没法创建的,它是指 ActionDescriptor对象,是对 Action方法描述的一个对象,在mvc中,方法的调用是利用反射来实现的。下面我 们就具体讨论一下这个过程。
* 为什么要创建Action?
* ControllerDescriptor与ActionDescriptor
* ActionMethodSelector是什么?
* 获取全部合法的Action
为什么要创建Action?Top
在一个请求到达时,必然最终会由一个Action去执行,那么这个Action是怎么 执行的呢?答案是利用反射得到 Action的描述,然后再调用Action的。为什么要 这么大费周折呢?因为在Action上还有好多Filter,我们要在执行的时候考虑到 AOP的影响,并把二者无缝的结合起来。所以在执行Action上,我们要得到一个 ActionDescriptor对象,这个对象用以描述Action方法的一些特性。
ControllerDescriptor与ActionDescriptor
ControllerDescriptor是描述Controller的类,ActionDescriptor是描述 Action的类,而Action是 Controller的方法,那么在ControllerDescriptor和 ActionControllerDescriptor两者之间就必然存在着某种关联,下面我们看看到 底他们是一种什么关系:
在ControllerActionInvoker类中,我们发现了两个类直接的一次协作,代码 是这样的:
ControllerDescriptor controllerDescriptor = GetControllerDescriptor(controllerContext);
ActionDescriptor actionDescriptor = FindAction(controllerContext, controllerDescriptor, actionName);
ActionDescriptor actionDescriptor = controllerDescriptor.FindAction(controllerContext, actionName);
我们看到,ActionDescriptor是调用ControllerDescriptor的FindAction方法 得到的。我们猜想它们可能是一对多关系,一个ControllerDescriptor对应多个 ActionDescriptor,下面就一步一步来验证我们的猜想,首先我们先从 ReflectedControllerDescriptor类入手,因为这个类是ControllerDescriptor类 的惟一继承者。
ReflectedControllerDescriptor类有几个比较重要的字段:
private ActionDescriptor[] _canonicalActionsCache;
private readonly Type _controllerType;
private readonly ActionMethodSelector _selector;