每当我在MVC3中请求新页面时,都会创建我的控制器构造函数的实例

时间:2011-06-25 07:22:35

标签: asp.net-mvc

我的控制器的构造函数中有很多东西。是不是每次我用MVC3请求新页面时,构造函数都会执行?

5 个答案:

答案 0 :(得分:6)

需要一个控制器实例来为每个请求提供服务。为了获得这个实例(显然),每个请求都会调用控制器构造函数。这就是说你应该避免在这个构造函数中做很多事情。例如,有些情况下,对于此控制器上的某些特定操作,您不需要所有这些初始化,尽管如此,如果将它放在构造函数中,它将被执行。如果您执行的任务只是实例化控制器所需的其他依赖项,那么您不应该担心性能,您应该担心正确构建应用程序,因为这个工作应该由DI框架处理。

另一个常见的问题是,在构造函数内部,您还无法访问HttpContext,并且某些属性(如Request,Response,...)可能在控制器构造函数中不可用。它们在Initialize方法中可用。

所有这些都说我建议你不要在构造函数中将代码(除了将ctor参数依赖项存储到私有变量中以注入服务,存储库等内容之外)。

答案 1 :(得分:4)

Controller基类包括ControllerContext,它是控制器的每请求上下文,例如包含对HttpContext的引用。

让这一刻沉沦。

编写自定义ControllerBuilder或使用新的DependencyResolver使用您喜欢的DI容器提供单例控制器非常容易。但这意味着你的控制器可能会保留先前请求的状态。

事实上,当人们使用Castle Windsor(我们被告知默认使用Singleton)来创建控制器时,最常见的错误之一就是它们会产生奇怪的行为。

正如其他人所指出的那样,如果你的控制器在构造函数中做了很多工作,那么重构工作就会成为你控制器的一个依赖,它会通过你的控制器的contstructor传入。让我们将该依赖称为“服务”。

该服务本身可以是单例(只要它不能保持每个请求状态),并且可以使用DependencyResolver与DI容器结合来实例化控制器。

答案 2 :(得分:1)

由ControllerFactory决定这一点;控制器工厂提供控制器实例。您可以构建缓存控制器的能力,但是:最好不要通过控制器的ctor传递这些引用。最好分别缓存每个引用,并在构造期间传递给控制器​​,并让控制器每次都重新创建。如果您缓存控制器,它将缓存其他可能类似于HttpContext的引用,这不是当前请求。

HTH。

答案 3 :(得分:0)

是的,M Jacob这有助于我们在每个请求中为新的DataContext提出数据访问请求,并且它非常有效。建议在每个请求中初始化一个新的DataContext(在你的控制器构造函数中),而不是创建持久的DataContext。

答案 4 :(得分:0)

互联网是无国籍的,服务器无法真正区别于那里的任何其他人(从技术上讲,忽略会话和cookie)。您将获得内容,并与您建立连接。在您的新请求中,事情从头开始。我同意你的观点,即无法保持对象存活是一种开销,但是如果有数百万用户向同一对象发出不同请求的请求,则会产生更大的开销。保持同一物体的百万份副本几乎是不可能的。

此致

Huske