欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

ASP.NET MVC 描述类型(二)

程序员文章站 2022-07-01 15:08:14
asp.net mvc 描述类型(二) 前言 上个篇幅中说到controllerdescriptor类型的由来过程,对于controllerdescriptor类型来言action...

asp.net mvc 描述类型(二)

前言

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

actiondescriptor类型的生成

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

图1

ASP.NET MVC 描述类型(二)

在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 描述类型(二)

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

图3

ASP.NET MVC 描述类型(二)

对于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共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面

喎?https:>