当asp.net应用程序被通知URL时,它会将其路由到适当的控制器,特别是适当的方法.
这些控制器是否放置在堆栈一次?还是再次为每个请求实例化?
例如,说我有一个控制器,在一个类的声明中被实例化了一个linq-to-sql类.如果我有n个请求路由到该控制器,我是否生成了不同的linq-to-sql类对象,每个对象在自己的控制器实例中或只有1个?
我的直觉告诉我,由于线程安全原因,控制人员每个请求产生一个控制器,但是似乎没有比我自己的胃肠道恶魔挖掘更好的指南.
解决方法
默认情况下,它们每次都被DefaultControllerFactory实例化.具体来说,在GetControllerInstance中,
(IController)Activator.CreateInstance(controllerType);
首先调用CreateController,它调用GetControllerType来根据控制器名称和路由数据令牌中传递的Namespaces获取控制器类型.然后它调用GetControllerInstance,它创建一个控制器的实例.
没有比MVC framework source code itself更好的指南.
您可以通过实现IControllerFactory定义您自己的ControllerFactory,然后控制控制器的实例化和何时.