Dot-Net

ASP.NET MVC:是否為每個請求創建了控制器?

  • March 24, 2011

非常簡單的問題:ASP.NET 中的控制器是為每個 HTTP 請求創建的,還是在應用程序啟動時創建並在整個請求中重用?

是否會僅為特定的 HTTP 請求創建控制器?

如果我之前的假設是正確的,我可以依賴它嗎?我想創建僅適用於一個請求的數據庫上下文(實體框架)。如果我將它創建為在控制器的建構子中初始化的屬性,是否允許為每個請求創建新的上下文實例?

ControllerFactory由(預設情況下是)為每個請求創建一個控制器DefaultControllerFactory

<http://msdn.microsoft.com/en-us/library/system.web.mvc.defaultcontrollerfactory.aspx>

請注意,Html.ActionHtml Helper 將創建另一個控制器。

簡短的版本是ControllerActivator.Create呼叫(對於每個請求)來創建一個控制器(如果沒有設置解析器,它通過 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(() =&gt;
   {
       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));
   }

這可能屬於太多資訊…但我想表明您確實會為每個請求獲得一個新控制器。

引用自:https://stackoverflow.com/questions/5425920