我正在学习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");
}
}
答案 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。