zoukankan      html  css  js  c++  java
  • ASP.NET MVC 描述类型(二)

    ASP.NET MVC 描述类型()


    前言

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

     

    ActionDescriptor类型的生成

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

    1

    wKioL1PHyQ6Cy56AAAK9X-kV09Y726.jpg

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

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

    代码1-1

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    public class ReflectedActionDescriptor : ActionDescriptor
        {
            publicReflectedActionDescriptor(MethodInfomethodInfo, string actionName, ControllerDescriptor controllerDescriptor);
            public override stringActionName { get; }
            public override ControllerDescriptorControllerDescriptor { get; }
            //
            // 摘要:
            //     获取或设置操作-方法信息。
            //
            // 返回结果:
            //     操作-方法信息。
            public MethodInfo MethodInfo { get;}
            public override stringUniqueId { get; }
      
            // 摘要:
            //     使用指定的操作-方法参数来执行指定的控制器上下文。
            //
            // 参数:
            //   controllerContext:
            //     控制器上下文。
            //
            //   parameters:
            //     参数。
            //
            // 返回结果:
            //     操作返回值。
            //
            // 异常:
            //   System.ArgumentNullException:
            //     parameters 或 controllerContext 参数为 null。
            public override objectExecute(ControllerContext controllerContext,IDictionary<string,object> parameters);
            public override object[]GetCustomAttributes(bool inherit);
            public override object[]GetCustomAttributes(Type attributeType, bool inherit);
            public override ParameterDescriptor[]GetParameters();
            public override ICollection<ActionSelector> GetSelectors();
            public override boolIsDefined(Type attributeType, bool inherit);
        }


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

     

    ActionDescriptor类型的重要性

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

    2

    wKioL1PHyUHiEeTnAATXlMTzdoU435.jpg

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

    3

    wKiom1PHyECSmeGHAADIwu4aj-8335.jpg

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

    图4

    wKioL1PHyXOjSL1tAANKKc50ww4354.jpg

    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引擎。






         本文转自jinyuan0829 51CTO博客,原文链接:http://blog.51cto.com/jinyuan/1439688,如需转载请自行联系原作者




  • 相关阅读:
    程序员的学习和积累
    【STL】-迭代器的用法
    【STL】-list的用法
    【STL】-deque的用法
    【STL】- vector的用法
    数据结构-各种排序算法
    【STL】-priority_queue的用法
    数据结构-二项队列
    IT公司100题-8-智力题
    IT公司100题-7-判断两个链表是否相交
  • 原文地址:https://www.cnblogs.com/twodog/p/12138902.html
Copyright © 2011-2022 走看看