Dot-Net
ASP.NET MVC:是否為每個請求創建了控制器?
非常簡單的問題: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(() => { 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)); }這可能屬於太多資訊…但我想表明您確實會為每個請求獲得一個新控制器。