의 모든 요청에 대해 컨트롤러가 생성 ControllerFactory
됩니다 (기본적으로 DefaultControllerFactory
).
http://msdn.microsoft.com/en-us/library/system.web.mvc.defaultcontrollerfactory.aspx
점을 유의 Html.Action
HTML을 도우미가 다른 컨트롤러를 생성합니다.
짧은 버전은 ControllerActivator.Create
(모든 요청에 대해) 컨트롤러를 생성하기 위해 호출됩니다 (Resolver가 설정되지 않은 경우 DependencyResolver 또는 Activator를 통해 새 컨트롤러를 초기화 함).
public IController Create(RequestContext requestContext, Type controllerType)
{
try
{
return (IController)(_resolverThunk().GetService(controllerType) ?? Activator.CreateInstance(controllerType));
}
더 긴 버전은 다음과 같습니다 (MvcHandler의 소스 코드는 다음과 같습니다).
protected internal virtual void ProcessRequest(HttpContextBase httpContext)
{
SecurityUtil.ProcessInApplicationTrust(() =>
{
IController controller;
IControllerFactory factory;
ProcessRequestInit(httpContext, out controller, out factory);
try
{
controller.Execute(RequestContext);
}
finally
{
factory.ReleaseController(controller);
}
});
}
private void ProcessRequestInit(HttpContextBase httpContext, out IController controller, out IControllerFactory factory)
{
// non-relevant code
// Instantiate the controller and call Execute
factory = ControllerBuilder.GetControllerFactory();
controller = factory.CreateController(RequestContext, controllerName);
if (controller == null)
{
throw new InvalidOperationException(
String.Format(
CultureInfo.CurrentCulture,
MvcResources.ControllerBuilder_FactoryReturnedNull,
factory.GetType(),
controllerName));
}
}
컨트롤러 공장 코드는 다음과 같습니다.
public virtual IController CreateController(RequestContext requestContext, string controllerName)
{
Type controllerType = GetControllerType(requestContext, controllerName);
IController controller = GetControllerInstance(requestContext, controllerType);
return controller;
}
기본적으로 이것을 호출합니다.
protected internal virtual IController GetControllerInstance(RequestContext requestContext, Type controllerType)
{
return ControllerActivator.Create(requestContext, controllerType);
}
ControllerActivator
(이 코드는 DependencyResolver에게 인스턴스를 요청하거나 Activator 클래스를 사용합니다) 에서이 메서드를 호출합니다 .
public IController Create(RequestContext requestContext, Type controllerType)
{
try
{
return (IController)(_resolverThunk().GetService(controllerType) ?? Activator.CreateInstance(controllerType));
}
이것은 너무 많은 정보에 속할 수 있습니다. 그러나 저는 당신이 정말로 모든 요청에 대해 새로운 컨트롤러를 얻는다는 것을 보여주고 싶었습니다.