MVC 請求處理核心在於將 URL 對應至 ActionDescriptor(動作描述物件),再透過反射呼叫對應方法。本文深入剖析 ControllerActionInvoker 如何協作 ControllerDescriptor 與 ActionDescriptor:
ControllerDescriptor controllerDescriptor = GetControllerDescriptor(controllerContext);
ActionDescriptor actionDescriptor = FindAction(controllerContext, controllerDescriptor, actionName);
// 實際上等同於:
ActionDescriptor actionDescriptor = controllerDescriptor.FindAction(controllerContext, actionName);
ControllerDescriptor 唯一實作,持有:
_canonicalActionsCache:快取所有合法 ActionDescriptor 陣列。_controllerType:Controller CLR 型別。_selector:ActionMethodSelector 執行個體,負責依據屬性(HttpGet、ActionName、NonAction 等)篩選合法動作方法。Action 方法上常附掛多個 Filter(Authorization、Action、Result、Exception),執行時需將 Filter 與 Action 無縫整合(AOP),ActionDescriptor 保存方法中繼資料(參數、回傳型別、屬性),供 Invoker 建構執行管線使用。
文章為系列探討 MVC 內部機制的開篇,後續將詳細說明 ActionMethodSelector 運作細節。