在 ASP.NET MVC 中,我在我读过的大量“页面生命周期”或“请求生命周期”文章中找不到任何涉及对象处理的文章。在操作方法中,如果我创建到数据库的连接(或者可能创建到 EF 的上下文),如果我没有显式调用 dispose,它是否会被释放?
我知道模型绑定到视图可能仍然需要一个打开的连接(特别是如果它正在为具有关联的 EF 对象提供服务),但是它是否会处理在请求期间实例化的所有内容?如果是这样,有人可以向我指出这一点吗?
在 ASP.NET MVC 中,我在我读过的大量“页面生命周期”或“请求生命周期”文章中找不到任何涉及对象处理的文章。在操作方法中,如果我创建到数据库的连接(或者可能创建到 EF 的上下文),如果我没有显式调用 dispose,它是否会被释放?
我知道模型绑定到视图可能仍然需要一个打开的连接(特别是如果它正在为具有关联的 EF 对象提供服务),但是它是否会处理在请求期间实例化的所有内容?如果是这样,有人可以向我指出这一点吗?
为每个请求创建一个控制器对象的新实例。这意味着一旦执行操作,对该控制器的引用就会丢失。它留给垃圾收集器来处理和关闭所有资源密集型对象。
因此,最佳实践始终是关闭并处理 action 方法本身中的所有重载对象。
我知道在绑定 EF 对象时视图需要实时连接。同样,这里的最佳实践是在绑定到视图之前枚举它们。
您的问题的答案是 - 垃圾收集器将负责处理或关闭在操作方法中保持打开的连接 - 这是灾难的公式。
编辑 注意:控制器类实现了 IDisposable,所以它应该在请求被处理后被处理掉。但是,当我检查 DefaultControllerFactory 的源代码时,我无法确定任何使用范围或显式处置调用。
参考
http://aspnetwebstack.codeplex.com/SourceControl/changeset/view/5d4159c85ff6#src/System.Web.Mvc/DefaultControllerFactory.cs
在请求完成后,控制器范围或操作范围中声明的所有内容都会被释放。