ASP.NET MVC控制器生命周期

Jos*_*rce 63 c# asp.net-mvc

我的理解是,在每个Web请求期间都不会调用控制器的构造函数.假设这是真的,控制器的生命周期是什么?是应用程序启动时"构造",然后使用每个Web请求注入的requestcontext进行缓存和调用吗?

为了清楚起见,我不是在问如何模拟构造函数行为,我使用OnActionExecuting事件来启动我通常在构造函数中执行的操作.另外,我确实在控制器上使用构造函数进行单元和系统测试.

谢谢!

Dar*_*rov 84

如果使用默认控制器工厂,将为每个请求构建一个新实例,这就是应该的方式.不应在不同请求之间共享控制器.您可以编写一个管理控制器生命周期的自定义工厂.

  • 但是为什么呢?为什么? (10认同)
  • @ChrisOldwood只是因为API是无状态的并不意味着底层代码是无状态的.可能存在在控制器构造处实例化的记录器或其他实用程序,其反对跨请求重用. (10认同)
  • 我搞砸了,自学了为什么会这样,应该是这样的.我正在使用EF创建具有读/写操作和视图的控制器.生成的代码为EF Context实例创建了一个私有实例变量.我以为我会很聪明,并把它变成一个静态变量.问题是,如果此控制器范围之外的某些内容修改了数据库,则静态上下文永远不会知道.现在我将其作为实例变量保留,并且由于每个请求都创建了一个新实例,因此上下文可以看到对数据库的任何更改. (2认同)
  • 在所有状态都包含在参数(即功能样式)内的Web API中,没有理由(我可以看到)为什么不能重用控制器。通过设计它是线程安全的。 (2认同)

Tho*_*ler 13

我害怕,你的理解是错误的.控制器(应该是一个非常轻薄的类,并且不能具有任何会话超出状态)实际上是为每个Web请求动态构建的.控制器实例如何才能特定于某个视图?

所以没有"生命周期"这样的东西(除了请求之外)......


Har*_*ips 7

为您执行的每个请求创建一个控制器.让我们举个例子.

   public class ExampleController : Controller{
           public static userName;

            public void Action1(){//do stuff}
            public void Action2(){//do stuff}
            public void AssignUserName(string username){
                 userName = username;

            }
           public string GetName(){ return userName;}


   }
Run Code Online (Sandbox Code Playgroud)

现在,您可以从通过用户名的视图中调用控制器.不希望获得您在下一个请求中设置的userName.它将返回null.因此,对于每个请求,创建新的控制器.您不会在MVC中的任何位置实例化控制器,就像从类中实例化对象一样.只是你没有控制器对象内存指针来调用它,就像你对其他对象一样.

转到此链接.关于MVC控制器的生命周期有一个很好的解释.

ASP.Net MVC - 请求生命周期