2

可能重复:
与 ASP.NET WebForms 相比,ASP.NET MVC 页面的“页面生命周期”是什么?

在 ASP.NET MVC 中,我在我读过的大量“页面生命周期”或“请求生命周期”文章中找不到任何涉及对象处理的文章。在操作方法中,如果我创建到数据库的连接(或者可能创建到 EF 的上下文),如果我没有显式调用 dispose,它是否会被释放?

我知道模型绑定到视图可能仍然需要一个打开的连接(特别是如果它正在为具有关联的 EF 对象提供服务),但是它是否会处理在请求期间实例化的所有内容?如果是这样,有人可以向我指出这一点吗?

4

2 回答 2

3

为每个请求创建一个控制器对象的新实例。这意味着一旦执行操作,对该控制器的引用就会丢失。它留给垃圾收集器来处理和关闭所有资源密集型对象。

因此,最佳实践始终是关闭并处理 action 方法本身中的所有重载对象。

我知道在绑定 EF 对象时视图需要实时连接。同样,这里的最佳实践是在绑定到视图之前枚举它们。

您的问题的答案是 - 垃圾收集器将负责处理或关闭在操作方法中保持打开的连接 - 这是灾难的公式。

编辑 注意:控制器类实现了 IDisposable,所以它应该在请求被处理后被处理掉。但是,当我检查 DefaultControllerFactory 的源代码时,我无法确定任何使用范围或显式处置调用。

参考

http://aspnetwebstack.codeplex.com/SourceControl/changeset/view/5d4159c85ff6#src/System.Web.Mvc/DefaultControllerFactory.cs
于 2012-12-27T15:22:42.120 回答
1

在请求完成后,控制器范围或操作范围中声明的所有内容都会被释放。

于 2012-12-27T15:21:50.597 回答