內容概覽
本篇主要探討“Action”的創建過程,為什麼要加引號呢?因為我們創建的不 是真正的Action,方法是沒法創建的,它是指 ActionDescriptor對象,是對 Action方法描述的一個對象,在mvc中,方法的調用是利用反射來實現的。下面我 們就具體討論一下這個過程。
* 為什麼要創建Action?
* ControllerDescriptor與ActionDescriptor
* ActionMethodSelector是什麼?
* 獲取全部合法的Action
為什麼要創建Action?Top
在一個請求到達時,必然最終會由一個Action去執行,那麼這個Action是怎麼 執行的呢?答案是利用反射得到 Action的描述,然後再調用Action的。為什麼要 這麼大費周折呢?因為在Action上還有好多Filter,我們要在執行的時候考慮到 AOP的影響,並把二者無縫的結合起來。所以在執行Action上,我們要得到一個 ActionDescriptor對象,這個對象用以描述Action方法的一些特性。
ControllerDescriptor與ActionDescriptor
ControllerDescriptor是描述Controller的類,ActionDescriptor是描述 Action的類,而Action是 Controller的方法,那麼在ControllerDescriptor和 ActionControllerDescriptor兩者之間就必然存在著某種關聯,下面我們看看到 底他們是一種什麼關系:
在ControllerActionInvoker類中,我們發現了兩個類直接的一次協作,代碼 是這樣的:
ControllerDescriptor controllerDescriptor = GetControllerDescriptor(controllerContext);
ActionDescriptor actionDescriptor = FindAction(controllerContext, controllerDescriptor, actionName);
ActionDescriptor actionDescriptor = controllerDescriptor.FindAction(controllerContext, actionName);
我們看到,ActionDescriptor是調用ControllerDescriptor的FindAction方法 得到的。我們猜想它們可能是一對多關系,一個ControllerDescriptor對應多個 ActionDescriptor,下面就一步一步來驗證我們的猜想,首先我們先從 ReflectedControllerDescriptor類入手,因為這個類是ControllerDescriptor類 的惟一繼承者。
ReflectedControllerDescriptor類有幾個比較重要的字段:
private ActionDescriptor[] _canonicalActionsCache;
private readonly Type _controllerType;
private readonly ActionMethodSelector _selector;