Welcome 微信登录

首页 / 网页编程 / ASP.NET / asp.net mvc中“Action”的创建

asp.net mvc中“Action”的创建2011-08-28 博客园 Creason New内容概览

本篇主要探讨“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;