上個篇幅中說到ControllerDescriptor類型的由來過程,對於ControllerDescriptor類型來言ActionDescriptor類型的生成則簡單的多了,本章的主題有兩個,第一是說明ActionDescriptor類型的生成過程,第二是描述ActionDescriptor類型的重要性,在哪裏體現它的重要性呢?對於前面篇幅的學習忽略了最後控制器方法的執行過程,而在這個執行過程當中ActionDescriptor類型起到了相當重要的做用,來看下文吧。框架
這裏我又要採用老手段了(「盜」圖),從前面的篇幅中拉過來示意圖,快速的說明ActionDescriptor類型的生成過程。ide
圖1學習
在ReflectedControllerDescriptor類型生成後,流程會回到MVC框架中,而且由之調用ControllerActionInvoker類型下的FindAction()方法,在FindAction()【是ControllerActionInvoker類型中的方法】的參數中,第一個參數類型是控制器上下文類型,第二個則是咱們在上篇中講解生成的ReflectedControllerDescriptor類型【ControllerDescriptor類型】,第三個則是控制器方法的名稱,第一個參數的暫且無論,在FindAction()方法中是會使用第二個ReflectedControllerDescriptor類型的參數中的FindAction()方法【圖中所示的FindAction()方法】,而且參數是引用上層的FindAction()方法傳遞下來的,而後經過ReflectedControllerDescriptor類型中的ActionMethodSelector類型變量生成一個MethodInfo類型的變量,用於實例化ReflectedActionDescriptor類型。spa
咱們看下ReflectedActionDescriptor類型的定義,示例代碼1-13d
代碼1-1code
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<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 bool IsDefined(Type attributeType, bool inherit); }
在代碼1-1中,我保留了兩個註釋一個是MethodInfo屬性的,還有一個就是Execute()方法的,由於這一個屬性一個方法在下面重要性小節中會有敘述到。blog
想必看過前面篇幅的朋友都知道,在ASP.NET MVC 過濾器(三)篇幅中咱們講解到了行爲過濾器的在MVC框架中的具體生成執行過程,而後在那個篇幅中由於主題不符的緣由,咱們忽略了Action的執行,看下示意圖2ip
圖2get
對於這幅示意圖有什麼不明白的朋友能夠去看博主所寫的ASP.NET MVC 過濾器(三)篇幅,而對於本篇而言爲了說明ActionDescriptor類型的重要性就須要講到Action的執行過程,上面的圖咱們只須要關注圖3的部分。博客
圖3
對於Action執行過程的入口是在ControllerActionInvoker類型的InvokeActionMethod()方法之中,看到圖3中的方法參數就明白了ActionDescriptor類型的重要性了。它是必須的,來看下圖4.
圖4
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引擎。
做者:金源
出處:http://www.cnblogs.com/jin-yuan/
本文版權歸做者和博客園共有,歡迎轉載,但未經做者贊成必須保留此段聲明,且在文章頁面