asp.net mvc 描述类型(二)

前言

上个篇幅中说到controllerdescriptor类型的由来过程,对于controllerdescriptor类型来言actiondescriptor类型的生成则简单的多了,本章的主题有两个,第一是说明actiondescriptor类型的生成过程,第二是描述actiondescriptor类型的重要性,在哪里体现它的重要性呢?对于前面篇幅的学习忽略了最后控制器方法的执行过程,而在这个执行过程中actiondescriptor类型起到了至关重要的作用,来看下文吧。

actiondescriptor类型的生成

这里我又要采用老手段了(“盗”图),从前面的篇幅中拉过来示意图,快速的说明actiondescriptor类型的生成过程。

图1

在reflectedcontrollerdescriptor类型生成后,流程会回到mvc框架中,并且由之调用controlleractioninvoker类型下的findaction()方法,在findaction()【是controlleractioninvoker类型中的方法】的参数中,第一个参数类型是控制器上下文类型,第二个则是我们在上篇中讲解生成的reflectedcontrollerdescriptor类型【controllerdescriptor类型】,第三个则是控制器方法的名称,第一个参数的暂且不管,在findaction()方法中是会使用第二个reflectedcontrollerdescriptor类型的参数中的findaction()方法【图中所示的findaction()方法】,并且参数是引用上层的findaction()方法传递下来的,然后通过reflectedcontrollerdescriptor类型中的actionmethodselector类型变量生成一个methodinfo类型的变量,用于实例化reflectedactiondescriptor类型。

我们看下reflectedactiondescriptor类型的定义,示例代码1-1

代码1-1

public class reflectedactiondescriptor : actiondescriptor
    {
        public reflectedactiondescriptor(methodinfo methodinfo, string actionname, controllerdescriptor controllerdescriptor);
        public override string actionname { get; }
        public override controllerdescriptor controllerdescriptor { get; }
        //
        // 摘要:
        //     获取或设置操作-方法信息。
        //
        // 返回结果:
        //     操作-方法信息。
        public methodinfo methodinfo { get; }
        public override string uniqueid { get; }

        // 摘要:
        //     使用指定的操作-方法参数来执行指定的控制器上下文。
        //
        // 参数:
        //   controllercontext:
        //     控制器上下文。
        //
        //   parameters:
        //     参数。
        //
        // 返回结果:
        //     操作返回值。
        //
        // 异常:
        //   system.argumentnullexception:
        //     parameters 或 controllercontext 参数为 null。
        public override object execute(controllercontext controllercontext, idictionary parameters);
        public override object[] getcustomattributes(bool inherit);
        public override object[] getcustomattributes(type attributetype, bool inherit);
        public override parameterdescriptor[] getparameters();
        public override icollection getselectors();
        public override bool isdefined(type attributetype, bool inherit);
    }

在代码1-1中,我保留了两个注释一个是methodinfo属性的,还有一个就是execute()方法的,因为这一个属性一个方法在下面重要性小节中会有叙述到。

actiondescriptor类型的重要性

想必看过前面篇幅的朋友都知道,在asp.net mvc 过滤器(三)篇幅中我们讲解到了行为过滤器的在mvc框架中的具体生成执行过程,然后在那个篇幅中因为主题不符的原因,我们忽略了action的执行,看下示意图2

图2

对于这幅示意图有什么不明白的朋友可以去看博主所写的asp.net mvc 过滤器(三)篇幅,而对于本篇而言为了说明actiondescriptor类型的重要性就需要讲到action的执行过程,上面的图我们只需要关注图3的部分。

图3

对于action执行过程的入口是在controlleractioninvoker类型的invokeactionmethod()方法之中,看到图3中的方法参数就明白了actiondescriptor类型的重要性了。它是必须的,来看下图4.

图4<喎?https: www.2cto.com/kf/ware/vc/”=”” target=”_blank” class=”keylink”>vcd4kpha+pgltzybzcmm9″https://www.2cto.com/uploadfile/collfiles/20140718/20140718094935233.png” alt=”\” width=”779″ height=”326″>

actiondescriptor类型是抽象的,在上个小节中也有看到定义,mvc框架默认生成就是reflectedactiondescriptor类型,在图4中可以看到,mvc框架一开始就会调用actiondescriptor类型的execute()方法,只不过这里是由实现类型reflectedactiondescriptor类型替代了,然后会接着调用actiondescriptor类型中的actionmethoddispatchercache类型的的变量的getdispatcher()方法,然后会由actionmethoddispatcher类型中定义的为getexecutor()方法,这个方法内部实现就是拆解的methodinfo信息,并且返回的是actionexecutor委托类型,最终由actionmethoddispatcher类型的execute()方法【实际执行的是actionexecutor委托】执行最后的action,并且返回一个值,然后通过controlleractioninvoker类型中的createactionresult()引用刚刚action执行后的值生成actionresult类型的实例,最后在invokeactionresult()方法的实现中,mvc框架会调用actionresult类型的实例executeresult()方法来通往view引擎。

作者:金源

出处:https://blog.csdn.net/jinyuan0829

本文版权归作者和csdn共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面