ASP.NET MVC 中,ControllerDescriptor 與 ActionDescriptor 分別描述控制器與動作方法的元數據。它們各有同步與非同步兩個版本,那麼這些描述對象究竟是在何時、由誰建立的?本文將探討 ControllerActionInvoker 與 AsyncControllerActionInvoker 在此過程中的關鍵角色。
ActionInvoker 專責執行 Action 方法。Controller 基類擁有 ActionInvoker 屬性,預設用於該控制器所有 Action 的執行。介面定義如下:
public interface IActionInvoker
{
bool InvokeAction(ControllerContext controllerContext, string actionName);
}
public abstract class Controller
{
public IActionInvoker ActionInvoker { get; set; }
}
非同步版本 IAsyncActionInvoker 繼承自 IActionInvoker,並新增 BeginInvokeAction/EndInvokeAction 方法。
ControllerActionInvoker,實作非同步介面,用於非同步 Action 執行。兩者皆定義 GetControllerDescriptor 受保護方法,用於根據 ControllerContext 取得對應的 ControllerDescriptor。非同步版本覆寫了此方法。
ASP.NET MVC 透過 DependencyResolver 依序嘗試解析:
IAsyncActionInvoker 介面解析,若非 null 則採用。IActionInvoker 介面解析,若非 null 則採用。若皆無註冊,則回退至內建預設實作。
ControllerDescriptor 與 ActionDescriptor 的建立緊密綁定於 ActionInvoker 的生命週期。理解此機制有助於擴展自訂動作執行邏輯或整合依賴注入容器。