Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/extjs/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# ASP.NET MVC控制器生命周期_C#_Asp.net Mvc - Fatal编程技术网

C# ASP.NET MVC控制器生命周期

C# ASP.NET MVC控制器生命周期,c#,asp.net-mvc,C#,Asp.net Mvc,据我所知,在每次web请求期间,不会调用控制器的构造函数。假设这是真的,那么控制器的生命周期是什么?是否在应用程序启动时“构造”,然后缓存并调用requestcontext,并随每个web请求一起注入其中 为了清楚起见,我不是在问如何模拟构造函数行为,我使用OnActionExecuting事件来启动通常在构造函数中执行的操作。此外,我在控制器上使用构造函数进行单元和系统测试 谢谢 如果您使用该方法,将为每个请求构造一个新实例,这就是它应该采用的方式。控制器不应在不同的请求之间共享。您可以编写一

据我所知,在每次web请求期间,不会调用控制器的构造函数。假设这是真的,那么控制器的生命周期是什么?是否在应用程序启动时“构造”,然后缓存并调用requestcontext,并随每个web请求一起注入其中

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


谢谢

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

恐怕您的理解是错误的。实际上,为每个web请求动态构造一个控制器(它应该是一个非常精简和轻量级的类,并且不能有任何会话超出生存状态)。控制器实例如何才能特定于某个视图


因此,没有“生命周期”(请求的生命周期除外)之类的东西。

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

   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控制器的生命周期有一个很好的解释


我把事情搞砸了,并自学了为什么会这样,为什么会这样。我正在使用EF创建具有读/写操作和视图的控制器。生成的代码为EF上下文实例创建了一个私有实例变量。我想我会很聪明,把它变成一个静态变量。问题是,如果此控制器范围之外的内容修改了数据库,静态上下文永远不会知道。现在我将其保留为实例变量,因为每个请求都会创建一个新实例,所以上下文可以看到数据库的任何更改。在所有状态都包含在参数(即函数样式)中的Web API中,没有理由(我可以看到)无法重用控制器。它在设计上是线程安全的。@ChrisOldwood仅仅因为API是无状态的并不意味着底层代码是无状态的。可能存在在控制器构造中实例化的记录器或其他实用程序,它们反对在请求之间重复使用。@Josh Kodrof另一种选择是创建必须是线程安全的控制器,因为不同线程中的不同请求访问同一控制器。您能保证控制器的所有依赖项都是这样吗?您的整个应用程序或多或少都必须是线程安全的。是的,肯定有“生命周期”在进行。在我的控制器中,我为所有帐户创建一个linq表达式,然后使用这个.Ok(帐户)返回。在控制器方法执行后,IEnumerator会在accounts集合上被调用,因此,是的,确实需要考虑liftetime。我不是MVC专业人士,但这不是我现在正在开发的MVC应用程序中看到的行为。我将一个控制器声明为
公共类ClassName:controller
,其中包含一个静态成员,
静态字符串PropertyName=“”。我发现存储在静态属性中的任何内容都会在请求之间保留。为什么我会看到这个?@andyb因为它是静态的,线程可以恢复,但不能保证