ASP.NET MVC:是否为每个请求创建控制器?
非常简单的问题:ASP.NET中的控制器是为每个HTTP请求创建的,还是在应用程序启动时创建并在整个请求中重用的 是否仅为特定HTTP请求创建控制器ASP.NET MVC:是否为每个请求创建控制器?,.net,asp.net-mvc-3,entity-framework,controller,httprequest,.net,Asp.net Mvc 3,Entity Framework,Controller,Httprequest,非常简单的问题:ASP.NET中的控制器是为每个HTTP请求创建的,还是在应用程序启动时创建并在整个请求中重用的 是否仅为特定HTTP请求创建控制器 如果我以前的假设是正确的,我能相信吗?我想创建只适用于一个请求的数据库上下文(实体框架)。如果我将其创建为控制器构造函数中初始化的属性,是否允许为每个请求创建新的上下文实例?我为控制器创建了一个空构造函数,并在构造函数中放置了一个断点。每次有新的请求,它都会被点击。因此,我认为它是为每个请求创建的。当执行特定控制器中的任何操作时,将创建控制器 我有
如果我以前的假设是正确的,我能相信吗?我想创建只适用于一个请求的数据库上下文(实体框架)。如果我将其创建为控制器构造函数中初始化的属性,是否允许为每个请求创建新的上下文实例?我为控制器创建了一个空构造函数,并在构造函数中放置了一个断点。每次有新的请求,它都会被点击。因此,我认为它是为每个请求创建的。当执行特定控制器中的任何操作时,将创建控制器 我有一个项目,其中我的所有控制器都继承自
ApplicationController
,每次执行操作时,断点都会在ApplicationController
内部命中,而不管其“当前”控制器如何
每当我的控制器被创建时,我初始化我的代理(作为我的上下文):
public IWidgetAgent widgetAgent { get; set; }
public WidgetController()
{
if (widgetAgent == null)
{
widgetAgent = new WidgetAgent();
}
}
这显然不是您所需要的—正如您提到的,每次调用它时,您只需要一个实例。但这是一个很好的地方,可以检查每次都发生了什么,并确保您的上下文的另一个实例当前不存在
希望这有帮助。为每个请求创建控制器。神奇发生在gobal.aspx中的路由中。映射路径将MVC指向要创建的控制器、要调用的控制器上的操作以及要传递给它们的参数
控制器由
ControllerFactory
为每个请求创建一个控制器(默认情况下是DefaultControllerFactory
)
请注意,Html.Action
Html助手将创建另一个控制器
简短的版本是调用ControllerActivator.Create
来创建控制器(通过DependencyResolver或通过Activator(如果未设置解析程序)):
较长的版本是这样的(以下是来自MvcHandler的源代码):
以下是控制器出厂代码:
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类):
这可能属于太多的信息。。。但我想表明,你确实可以为每个请求获得一个新的控制器。在构造函数中设置一个断点,看看你能找到什么…@Greg B:好主意,但它不会告诉我它是否总是这样-如果环境发生变化,某个控制器会改变其行为,我有一个可能很难解决的错误找到…@Todd Smith请提供一些链接或至少是全名。树字母很难用谷歌搜索。谢谢。@drasto IoC=Inversion of control+1我希望你是对的,但我希望得到比“在我尝试过的所有情况下都有效”更好的知识。如果它有时因为某种原因不能像那样工作,那就是一个错误。@drasto:不用担心。为每个请求实例化控制器。虽然有些内存可以重用,但您不必担心控制器状态(如果您有)。它将按预期进行初始化。但是,可能会有一种情况,其中会实例化多个控制器。此时视图调用控制器操作(即,
Html.RenderAction(“操作”、“控制器”);
)引用需要-在链接文档中找不到支持信息。感谢you@Daniel@drasto这是引文,这对性能不好吗?
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);
}
public IController Create(RequestContext requestContext, Type controllerType)
{
try
{
return (IController)(_resolverThunk().GetService(controllerType) ?? Activator.CreateInstance(controllerType));
}