当一个asp.net应用程序收到URL通知时,它会将它路由到适当的控制器,特别是相应的方法。
这些控制器是否一次放在堆栈上?或者它们是否会针对每个请求再次实例化?
例如,假设我有一个带有linq-to-sql类的控制器,它可以在类的声明中实例化。如果我有n个请求路由到该控制器,我是否已经生成了n个不同的linq-to-sql类对象,每个对象都在它们自己的控制器实例中或只有1个?
我的直觉告诉我,出于线程安全的原因,每个请求都会产生一个控制器,但我似乎无法找到比我自己的胃肠神谕更好的指导。
答案 0 :(得分:7)
默认情况下,每次都会DefaultControllerFactory
实例化它们。具体来说,在GetControllerInstance
,
(IController)Activator.CreateInstance(controllerType);
首先调用 CreateController
,调用GetControllerType
以根据控制器名称和路径数据令牌中传递的命名空间获取控制器类型。然后它调用GetControllerInstance
来创建控制器的实例。
没有比 MVC framework source code itself 更好的指南。
您可以通过实现IControllerFactory
来定义自己的ControllerFactory,然后控制实例化控制器的方式和时间。