Controller 基類 ControllerBase 的 Execute 核心在於 Action 方法與 ActionResult 的執行,兩者皆由 ActionInvoker 組件負責。
public interface IActionInvoker
{
void InvokeAction(ControllerContext controllerContext, string actionName);
}
public class ControllerActionInvoker : IActionInvoker
{
public IModelBinder ModelBinder { get; private set; }
public ControllerActionInvoker() { this.ModelBinder = new DefaultModelBinder(); }
public void InvokeAction(ControllerContext controllerContext, string actionName)
{
MethodInfo method = controllerContext.Controller.GetType().GetMethods()
.First(m => string.Compare(actionName, m.Name, true) == 0);
List<object> parameters = new List<object>();
foreach (ParameterInfo parameter in method.GetParameters())
{
parameters.Add(this.ModelBinder.BindModel(controllerContext, parameter.Name, parameter.ParameterType));
}
ActionResult actionResult = method.Invoke(controllerContext.Controller, parameters.ToArray()) as ActionResult;
actionResult.ExecuteResult(controllerContext);
}
}
IModelBinder 介面定義 BindModel 方法,預設實作 DefaultModelBinder 負責從請求資料綁定 Action 參數。
public interface IModelBinder
{
object BindModel(ControllerContext controllerContext, string modelName, Type modelType);
}