ASP.NET MVC 描述類型(二)
創(chuàng)新互聯(lián)網(wǎng)站建設(shè)服務(wù)商,為中小企業(yè)提供網(wǎng)站制作、網(wǎng)站設(shè)計(jì)服務(wù),網(wǎng)站設(shè)計(jì),網(wǎng)站托管等一站式綜合服務(wù)型公司,專業(yè)打造企業(yè)形象網(wǎng)站,讓您在眾多競爭對手中脫穎而出創(chuàng)新互聯(lián)。前言
上個篇幅中說到ControllerDescriptor類型的由來過程,對于ControllerDescriptor類型來言ActionDescriptor類型的生成則簡單的多了,本章的主題有兩個,第一是說明ActionDescriptor類型的生成過程,第二是描述ActionDescriptor類型的重要性,在哪里體現(xiàn)它的重要性呢?對于前面篇幅的學(xué)習(xí)忽略了最后控制器方法的執(zhí)行過程,而在這個執(zhí)行過程中ActionDescriptor類型起到了至關(guān)重要的作用,來看下文吧。
ActionDescriptor類型的生成
這里我又要采用老手段了(“盜”圖),從前面的篇幅中拉過來示意圖,快速的說明ActionDescriptor類型的生成過程。
圖1
在ReflectedControllerDescriptor類型生成后,流程會回到MVC框架中,并且由之調(diào)用ControllerActionInvoker類型下的FindAction()方法,在FindAction()【是ControllerActionInvoker類型中的方法】的參數(shù)中,第一個參數(shù)類型是控制器上下文類型,第二個則是我們在上篇中講解生成的ReflectedControllerDescriptor類型【ControllerDescriptor類型】,第三個則是控制器方法的名稱,第一個參數(shù)的暫且不管,在FindAction()方法中是會使用第二個ReflectedControllerDescriptor類型的參數(shù)中的FindAction()方法【圖中所示的FindAction()方法】,并且參數(shù)是引用上層的FindAction()方法傳遞下來的,然后通過ReflectedControllerDescriptor類型中的ActionMethodSelector類型變量生成一個MethodInfo類型的變量,用于實(shí)例化ReflectedActionDescriptor類型。
我們看下ReflectedActionDescriptor類型的定義,示例代碼1-1
代碼1-1
public class ReflectedActionDescriptor : ActionDescriptor { publicReflectedActionDescriptor(MethodInfomethodInfo, string actionName, ControllerDescriptor controllerDescriptor); public override stringActionName { get; } public override ControllerDescriptorControllerDescriptor { get; } // // 摘要: // 獲取或設(shè)置操作-方法信息。 // // 返回結(jié)果: // 操作-方法信息。 public MethodInfo MethodInfo { get;} public override stringUniqueId { get; } // 摘要: // 使用指定的操作-方法參數(shù)來執(zhí)行指定的控制器上下文。 // // 參數(shù): // controllerContext: // 控制器上下文。 // // parameters: // 參數(shù)。 // // 返回結(jié)果: // 操作返回值。 // // 異常: // System.ArgumentNullException: // parameters 或 controllerContext 參數(shù)為 null。 public override objectExecute(ControllerContext controllerContext,IDictionaryparameters); public override object[]GetCustomAttributes(bool inherit); public override object[]GetCustomAttributes(Type attributeType, bool inherit); public override ParameterDescriptor[]GetParameters(); public override ICollection GetSelectors(); public override boolIsDefined(Type attributeType, bool inherit); }
在代碼1-1中,我保留了兩個注釋一個是MethodInfo屬性的,還有一個就是Execute()方法的,因?yàn)檫@一個屬性一個方法在下面重要性小節(jié)中會有敘述到。
ActionDescriptor類型的重要性
想必看過前面篇幅的朋友都知道,在ASP.NET MVC 過濾器(三)篇幅中我們講解到了行為過濾器的在MVC框架中的具體生成執(zhí)行過程,然后在那個篇幅中因?yàn)橹黝}不符的原因,我們忽略了Action的執(zhí)行,看下示意圖2
圖2
對于這幅示意圖有什么不明白的朋友可以去看博主所寫的ASP.NET MVC 過濾器(三)篇幅,而對于本篇而言為了說明ActionDescriptor類型的重要性就需要講到Action的執(zhí)行過程,上面的圖我們只需要關(guān)注圖3的部分。
圖3
對于Action執(zhí)行過程的入口是在ControllerActionInvoker類型的InvokeActionMethod()方法之中,看到圖3中的方法參數(shù)就明白了ActionDescriptor類型的重要性了。它是必須的,來看下圖4.
圖4
ActionDescriptor類型是抽象的,在上個小節(jié)中也有看到定義,MVC框架默認(rèn)生成就是ReflectedActionDescriptor類型,在圖4中可以看到,MVC框架一開始就會調(diào)用ActionDescriptor類型的Execute()方法,只不過這里是由實(shí)現(xiàn)類型ReflectedActionDescriptor類型替代了,然后會接著調(diào)用ActionDescriptor類型中的ActionMethodDispatcherCache類型的的變量的GetDispatcher()方法,然后會由ActionMethodDispatcher類型中定義的為GetExecutor()方法,這個方法內(nèi)部實(shí)現(xiàn)就是拆解的MethodInfo信息,并且返回的是ActionExecutor委托類型,最終由ActionMethodDispatcher
類型的Execute()方法【實(shí)際執(zhí)行的是ActionExecutor委托】執(zhí)行最后的Action,并且返回一個值,然后通過ControllerActionInvoker類型中的CreateActionResult()引用剛剛Action執(zhí)行后的值生成ActionResult類型的實(shí)例,最后在InvokeActionResult()方法的實(shí)現(xiàn)中,MVC框架會調(diào)用ActionResult類型的實(shí)例ExecuteResult()方法來通往View引擎。
另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無理由+7*72小時售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務(wù)可用性高、性價比高”等特點(diǎn)與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場景需求。