C# ASP.NET MVC控制器生命周期
据我所知,在每次web请求期间,不会调用控制器的构造函数。假设这是真的,那么控制器的生命周期是什么?是否在应用程序启动时“构造”,然后缓存并调用requestcontext,并随每个web请求一起注入其中 为了清楚起见,我不是在问如何模拟构造函数行为,我使用OnActionExecuting事件来启动通常在构造函数中执行的操作。此外,我在控制器上使用构造函数进行单元和系统测试C# ASP.NET MVC控制器生命周期,c#,asp.net-mvc,C#,Asp.net Mvc,据我所知,在每次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因为它是静态的,线程可以恢复,但不能保证