我使用Visual Studio 2013创建了一个新的asp.net mvc-5 Web应用程序。我使用实体框架6映射了我的数据库表,实体框架6生成了一个.edmx
文件。然后我选择创建一个新的Controller类。我检查了新控制器类的生成代码,我发现在控制器类的末尾,我得到以下内容来处理当前的http请求: -
protected override void Dispose(bool disposing)
{
if (disposing)
{
db.Dispose();
}
base.Dispose(disposing);
}
现在我知道有关处理当前http请求的以下事实: -
上面的Dispose()方法将覆盖Controller基类中的Dispose方法。这个Dispose方法将在http请求处理结束时调用。
上面的Dispose()方法将配置当前的db连接,然后在Controller基类中调用Dispose()方法。
但我有以下问题: -
答案 0 :(得分:1)
您应该阅读关于Microsoft的这篇Dispose Pattern文章,它会介绍所有建议以及“做与否”。
...。有没有办法知道Controller基类中dispose方法的实现?
MVC [OKAY] Loaded ENV .env File as KEY=VALUE Format
[OKAY] Trimming display Output to 151 Columns
08:06:33 web.1 | DOCUMENT_ROOT changed to 'web/'
08:06:33 web.1 | 4 processes at 128MB memory limit.
08:06:33 web.1 | Starting php-fpm...
08:06:35 web.1 | Starting httpd...
08:06:35 web.1 | Application ready for connections on port 5000.
08:06:35 web.1 | (13)Permission denied: AH00072: make_sock: could not bind to address [::]:80
08:06:35 web.1 | (13)Permission denied: AH00072: make_sock: could not bind to address 0.0.0.0:80
08:06:35 web.1 | no listening sockets available, shutting down
08:06:35 web.1 | AH00015: Unable to open logs
08:06:35 web.1 | Process exited unexpectedly: httpd
08:06:35 web.1 | Going down, terminating child processes...
[DONE] Killing all processes with signal null
08:06:35 web.1 Exited Abnormally
类型没有Controller
的实际实现,但确实以您可以覆盖的虚拟方法的形式为您的代码提供占位符。
Dispose
..在一些在线教程中,他们在dispose方法中调用以下方法:
的默认实现的一部分/// <summary> /// Releases all resources that are used by the current instance of the <see cref="T:System.Web.Mvc.Controller"/> class. /// </summary> public void Dispose() { this.Dispose(true); GC.SuppressFinalize((object) this); } /// <summary> /// Releases unmanaged resources and optionally releases managed resources. /// </summary> /// <param name="disposing">true to release both managed and unmanaged resources; false to release only unmanaged resources.</param> protected virtual void Dispose(bool disposing) { }
。所以我不确定这是否是Dispose()...
不,如果您实际上直接使用非托管代码/内存,则只需调用此方法,在这种情况下,您应该实现终结器或在类型上使用安全句柄以确保释放非托管内存。另请参阅GC.SuppressFinalize上的Microsoft文档。对于MVC GC.SuppressFinalize(this)
类型,它已经为您调用,因此无需再次添加。
对Controller
的调用确保如果一个类型有一个终结器并且是Disposable(实现IDisposable),那么它不会被提升到垃圾收集器中的下一代,这会使它在一段时间后停留一段时间当释放那一代对象时,将调用终结器。它告诉垃圾收集器该对象已被清理并且终结器不需要运行,因此继续释放/释放与该对象关联的所有内存。同样,如果你没有在对象上使用终结器,那么这不是必需的,因为GC在运行时不应该将对象提升到下一代。
答案 1 :(得分:0)
您可以查看the code for Controller并搜索Dispose方法,就是这样:
public void Dispose()
{
Dispose(true /* disposing */);
GC.SuppressFinalize(this);
}