NET MVC: 是否为每个请求创建控制器?

非常简单的问题: ASP.NET 中的控制器是为每个 HTTP 请求创建的,还是在应用程序启动时创建并在整个请求中重用的?

控制器是否只为特定的 HTTP 请求创建?

如果我以前的假设是正确的,我可以依赖它吗?我希望创建只为一个请求而存在的数据库上下文(实体框架)。如果我将它创建为在控制器的构造函数中初始化的属性,是否允许为每个请求创建新的上下文实例?

49698 次浏览

我为控制器创建了一个空的构造函数,并在构造函数中放置了一个断点。每次有新的请求都会被点击。所以我认为它是为每个请求创建的。

当执行特定控制器中的任何操作时,将创建控制器。

我有一个项目,其中我的所有控制器继承自一个 ApplicationController,每次执行一个动作,断点是内部的 ApplicationController命中-不管它的“ 目前”控制器。

每当像下面这样创建控制器时,我都会初始化我的代理(它作为我的上下文工作) :

    public IWidgetAgent widgetAgent { get; set; }


public WidgetController()
{
if (widgetAgent == null)
{
widgetAgent = new WidgetAgent();
}


}

这显然不是您所需要的——正如您提到的,每次调用它时,您只需要一个实例。但是这是一个很好的地方,可以检查每次发生了什么,并确保当前不存在上下文的另一个实例。

希望这个能帮上忙。

为每个请求创建控制器。神奇的事情发生在 gobal.aspx 的路由中。映射路径指导 MVC 创建哪个控制器,调用哪个控制器的操作,以及传递给它们的参数。

Http://www.asp.net/mvc/tutorials/asp-net-mvc-routing-overview-vb

每个请求都由 ControllerFactory(默认情况下是 DefaultControllerFactory)创建一个 Controller。

Http://msdn.microsoft.com/en-us/library/system.web.mvc.defaultcontrollerfactory.aspx

请注意,Html.Action Html 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));
}
}

这是 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 类) :

public IController Create(RequestContext requestContext, Type controllerType)
{
try
{
return (IController)(_resolverThunk().GetService(controllerType) ?? Activator.CreateInstance(controllerType));
}

这可能涉及到太多的信息... ... 但是我想说明的是,您确实为每个请求获得了一个新的控制器。