asp.net mvc 2控制器是如何实例化的?

Mus*_*hin 9 .net c# asp.net-mvc asp.net-mvc-2

当一个asp.net应用程序收到URL通知时,它会将它路由到适当的控制器,特别是相应的方法.

这些控制器是否一次放在堆栈上?或者他们是否为每个请求再次实例化?

例如,假设我有一个带有linq-to-sql类的控制器,它可以在类的声明中实例化.如果我有n个请求路由到该控制器,我是否已经生成了n个不同的linq-to-sql类对象,每个对象都在自己的控制器实例中,或者只有1个?

我的直觉告诉我,出于线程安全的原因,每个请求都会产生一个控制器,但我似乎无法挖掘出比我自己的胃肠道更好的指导.

Rus*_*Cam 7

DefaultControllerFactory默认情况下,每次都会实例化它们.具体来说,在GetControllerInstance,

(IController)Activator.CreateInstance(controllerType);
Run Code Online (Sandbox Code Playgroud)

CreateController首先调用哪个调用GetControllerType来根据控制器名称和路径数据标记中传递的命名空间来获取控制器类型.然后它调用GetControllerInstance创建控制器的实例.

没有比MVC框架源代码本身更好的指导.

您可以通过实现IControllerFactory然后控制实例化控制器的方式和时间来定义自己的ControllerFactory .

  • 查看源代码是一回事,但如果您按照以下指南设置源服务器,则可以逐步执行代码,这样可以很好地了解它的工作方式http://weblogs.asp.净/ gunnarpeipman /存档/ 2010/07/04 /乘降-ASP净MVC-源代码与视觉工作室,debugger.aspx (2认同)