控制器的操作在ASP.NET MVC中的CustomControllerFactory中执行的位置在哪里?

时间:2014-01-22 16:18:07

标签: c# asp.net-mvc

我正在学习ASP.NET MVC,我创建了一个自定义控制器工厂,只是为了理解应用程序的流程。

以下是我的自定义控制器工厂的代码。

我的问题是,虽然控制器的操作未在此范围内调用,但操作确实已执行。它是如何以及在何处发生的?

  

当我不从工厂调用时,如何执行索引操作?

using System.Web.Routing;
using System.Web.SessionState;

public class CustomControllerFactory : IControllerFactory
{
    public IController CreateController(
        RequestContext requestContext, 
        string controllerName)
    {
        Type targetType = null;
        switch (controllerName)
        {
            case "first":
            case "home":
                targetType = typeof(FirstController);
                break;
            case "second":
                targetType = typeof(SecondController);
                break;
        }
        var typ = targetType.GetType();
        return Activator.CreateInstance(targetType) as IController;
    }

    public SessionStateBehavior GetControllerSessionBehavior(
        RequestContext requestContext, 
        string controllerName)
    {
        return System.Web.SessionState.SessionStateBehavior.Default;
    }

    public void ReleaseController(IController controller)
    {
        IDisposable dispose = controller as IDisposable;
        if(dispose!= null)
        dispose.Dispose();
    }
}

我的FirstController代码如下:

public class FirstController : Controller
{
    //
    // GET: /First/
    public ActionResult Index()
    {
        return Content("first cotnroller");
    }
}

1 个答案:

答案 0 :(得分:3)

ControllerFactory仅负责创建相关控制器的实例,通常是实现DI变体来实例化控制器的地方。

执行操作是请求执行流程中的下一步。它由the ControllerActionInvoker通过InvokeAction method

完成
public virtual bool InvokeAction(
    ControllerContext controllerContext,
    string actionName
)
如图所示,

提供了controllerContext,它提供了控制器类的实例(即FirstController),以及要执行的操作的名称,在本例中为{{1 }}

如果您还要实现"Index"的自定义版本,可以通过实现the IActionInvoker interface并将每个控制器的ActionInvoker属性设置为{{的实例来实现1}}。

ActionInvoker

在控制器的构造函数中(可能在所有其他控制器继承的CustomActionInvoker构造函数中)。

有关ASP.NET MVC应用程序的整个执行流程,请参阅this answer