中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

ASP.NET MVC 描述類型(二)

發布時間:2020-07-04 22:38:00 來源:網絡 閱讀:872 作者:jinyuan0829 欄目:編程語言

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
    {
        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

ASP.NET MVC 描述類型(二)

對于這幅示意圖有什么不明白的朋友可以去看博主所寫的ASP.NET MVC 過濾器()篇幅,而對于本篇而言為了說明ActionDescriptor類型的重要性就需要講到Action的執行過程,上面的圖我們只需要關注圖3的部分。

3

ASP.NET MVC 描述類型(二)

對于Action執行過程的入口是在ControllerActionInvoker類型的InvokeActionMethod()方法之中,看到圖3中的方法參數就明白了ActionDescriptor類型的重要性了。它是必須的,來看下圖4.

圖4

ASP.NET MVC 描述類型(二)

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


向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

基隆市| 宁远县| 湖南省| 塘沽区| 金湖县| 沛县| 丰宁| 贵阳市| 成武县| 东平县| 洮南市| 福鼎市| 南投县| 台江县| 当涂县| 大关县| 天台县| 黎平县| 娄烦县| 乐山市| 彰化县| 肇源县| 晴隆县| 宜君县| 新疆| 孝昌县| 青龙| 陵水| 祁连县| 枣强县| 台北县| 灵台县| 加查县| 长汀县| 清水河县| 中卫市| 襄城县| 上林县| 和林格尔县| 洛浦县| 开原市|