很简单的问题:ASP.NET中的控制器是为每个HTTP请求创建的,还是在应用程序启动时创建并在整个请求中重用?是否仅为特定的HTTP请求创建控制器?如果我之前的假设是正确的,我可以依赖它吗?我想创建只为一个请求而存在的数据库上下文(实体框架)。如果我将其创建为在控制器的构造函数中初始化的属性,是否可以为每个请求创建新的上下文示例?
w3nuxt5m1#
ControllerFactory(默认为DefaultControllerFactory)为每个请求创建一个Controller。http://msdn.microsoft.com/en-us/library/system.web.mvc.defaultcontrollerfactory.aspx注意Html.Action Html Helper将创建另一个控制器。简短的版本是ControllerActivator.Create被调用(对于每个请求)来创建一个Controller(通过DependencyResolver或通过Activator初始化一个新的Controller,如果没有设置Resolver):
ControllerFactory
DefaultControllerFactory
Html.Action
ControllerActivator.Create
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)); } }
下面是Controller工厂代码:
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类):
ControllerActivator
这可能属于太多的信息...但我想表明,你真的得到一个新的控制器的每一个请求。
2ledvvac2#
我为控制器创建了一个空的构造函数,并在构造函数中放置了一个断点。每次有新的请求时,它都会被命中。所以我认为它是为每个请求创建的。
2izufjch3#
当执行特定控制器中的任何操作时,将创建控制器。我有一个项目,我所有的控制器都继承自ApplicationController,每次执行一个操作时,断点都会在ApplicationController内部命中-无论其“* 当前 *”控制器如何。每当我的控制器像这样创建时,我初始化我的代理(它作为我的上下文):
ApplicationController
public IWidgetAgent widgetAgent { get; set; } public WidgetController() { if (widgetAgent == null) { widgetAgent = new WidgetAgent(); } }
这显然不是您所需要的-正如您提到的,每次调用它时只需要一个示例。但是,它是一个很好的地方,可以检查每次发生的情况,并确保当前不存在上下文的另一个示例。希望这能帮上忙。
ergxz8rk4#
控制器是为每个请求创建的。神奇的是global.aspx中的路由。Map路径将MVC引导到要创建的控制器和要调用的控制器上的操作,以及要传递给它们的参数。http://www.asp.net/mvc/tutorials/asp-net-mvc-routing-overview-vb
4条答案
按热度按时间w3nuxt5m1#
ControllerFactory
(默认为DefaultControllerFactory
)为每个请求创建一个Controller。http://msdn.microsoft.com/en-us/library/system.web.mvc.defaultcontrollerfactory.aspx
注意
Html.Action
Html Helper将创建另一个控制器。简短的版本是
ControllerActivator.Create
被调用(对于每个请求)来创建一个Controller(通过DependencyResolver或通过Activator初始化一个新的Controller,如果没有设置Resolver):较长的版本如下(以下是来自MvcHandler的源代码):
下面是Controller工厂代码:
它基本上称之为:
它在
ControllerActivator
中调用此方法(此代码尝试向DependencyResolver请求示例,或仅使用Activator类):这可能属于太多的信息...但我想表明,你真的得到一个新的控制器的每一个请求。
2ledvvac2#
我为控制器创建了一个空的构造函数,并在构造函数中放置了一个断点。每次有新的请求时,它都会被命中。所以我认为它是为每个请求创建的。
2izufjch3#
当执行特定控制器中的任何操作时,将创建控制器。
我有一个项目,我所有的控制器都继承自
ApplicationController
,每次执行一个操作时,断点都会在ApplicationController
内部命中-无论其“* 当前 *”控制器如何。每当我的控制器像这样创建时,我初始化我的代理(它作为我的上下文):
这显然不是您所需要的-正如您提到的,每次调用它时只需要一个示例。但是,它是一个很好的地方,可以检查每次发生的情况,并确保当前不存在上下文的另一个示例。
希望这能帮上忙。
ergxz8rk4#
控制器是为每个请求创建的。神奇的是global.aspx中的路由。Map路径将MVC引导到要创建的控制器和要调用的控制器上的操作,以及要传递给它们的参数。
http://www.asp.net/mvc/tutorials/asp-net-mvc-routing-overview-vb