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

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请求创建控制器 如果我以前的假设是正确的,我能相信吗?我想创建只适用于一个请求的数据库上下文(实体框架)。如果我将其创建为控制器构造函数中初始化的属性,是否允许为每个请求创建新的上下文实例?我为控制器创建了一个空构造函数,并在构造函数中放置了一个断点。每次有新的请求,它都会被点击。因此,我认为它是为每个请求创建的。当执行特定控制器中的任何操作时,将创建控制器 我有

非常简单的问题: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));
    }