2009-11-19 97 views
50

这是我的理解,对于一个控制器构造每个Web请求期间不叫。假设这是事实,控制器的生命周期是什么? Is是在应用程序启动时“构建”的,然后使用每个Web请求注入的requestcontext进行缓存和调用?ASP.NET MVC控制器生命周期

只是要清楚,我不问如何模拟构造函数的行为,我用的是OnActionExecuting事件引发的事情,我会在构造函数通常做。另外,我还使用控制器上的构造函数进行单元和系统测试。

谢谢!

回答

74

如果使用default controller factory一个新的实例将建成为每个请求,这就是事情应该是这样。控制器不应该在不同的请求之间共享。你可以写一个自定义工厂来管理控制器的生命周期。

+10

虽然为什么?为什么? – 2012-03-09 22:01:19

+2

我搞砸了,并教导自己为什么这样,应该是这样。我正在使用EF创建具有读/写操作和视图的控制器。生成的代码为EF上下文实例创建了一个私有实例变量。我认为我会很聪明,并使之成为一个静态变量。问题是,如果这个控制器范围之外的东西修改了数据库,静态上下文永远不会知道。现在我将它作为一个实例变量保留下来,并且由于每个请求都创建了一个新实例,所以上下文可以看到数据库的任何更改。 – ThatAintWorking 2013-06-19 18:38:33

+1

在Web API,所有的状态包含的参数范围内(即功能性风格)没有理由(我可以看到),为什么控制器不能再被使用。它通过设计是线程安全的。 – 2013-09-19 09:10:15

10

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

因此,有没有这样的事情作为一个“生命周期”(比要求的除外)...创建

1

控制器为每个请求你做。让我们举个例子。

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;} 


    } 

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

到这个链接。对MVC控制器的生命周期有很好的解释。

ASP.Net MVC - Request Life Cycle