首页 / 网页编程 / 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与ActionDescriptorControllerDescriptor是描述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;