2010-10-21 55 views
10

当一个asp.net应用程序收到一个URL的通知时,它将它路由到适当的控制器,特别是适当的方法。如何实例化asp.net mvc 2控制器?

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

例如,假设我有一个linq-to-sql类的控制器,该类在类的声明中被实例化。如果我有n个请求进入该控制器,我是否产生了n个不同的linq-to-sql类对象,每个对象都在它们自己的控制器实例中,还是只有1个?

我的直觉告诉我控制器是由于线程安全原因而产生一个请求,但我似乎无法挖掘出比我自己的胃肠神经更好的指导。

+2

+1为胃肠神经使用的一个问题。 – 2010-10-21 19:21:16

+0

* gastrointestinal oracle *,lol :-))))))))+1 – 2010-10-21 19:35:55

回答

7

默认情况下,它们每次被DefaultControllerFactory实例化。具体而言,在GetControllerInstance

(IController)Activator.CreateInstance(controllerType); 

CreateController首次调用它调用GetControllerType获得基于控制器名称控制器类型,在该路由数据令牌传递的命名空间。然后它调用GetControllerInstance它创建控制器的一个实例。

没有比MVC framework source code itself更好的指导。

您可以通过实施IControllerFactory来定义自己的ControllerFactory,然后控制控制器如何以及何时实例化。

+0

谢谢。这是详细的msdn的某个地方?当我回答我自己的问题时,我似乎有50/50的投篮。 – MushinNoShin 2010-10-21 19:29:41

+1

已经更新了源代码的链接。它对于我们之间的好奇是无价的:) – 2010-10-21 19:34:47

+2

让源代码查看是一回事,但如果你按照以下指南设置源服务器,你可以逐步浏览代码,这样可以很好地理解它是如何工作的http://weblogs.asp.net/gunnarpeipman/archive/2010/07/04/stepping-into-asp-net-mvc-source-code-with-visual-studio-debugger.aspx – Chao 2010-10-22 13:38:57