我如何查看Dispose方法的“抽象类控制器”中包含的内容

时间:2016-04-01 17:28:41

标签: c# asp.net asp.net-mvc iis asp.net-mvc-5

我使用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请求的以下事实: -

  1. 上面的Dispose()方法将覆盖Controller基类中的Dispose方法。这个Dispose方法将在http请求处理结束时调用。

  2. 上面的Dispose()方法将配置当前的db连接,然后在Controller基类中调用Dispose()方法。

  3. 但我有以下问题: -

    1. 当我尝试访问基本配置方法时,使用“转到定义”,如下所示: -
    2. enter image description here

      我被重定向到抽象类中,使用Dispose()的空方法实现。那么有没有办法知道Controller基类中dispose方法的实现?

      1. 在一些在线教程中,他们在dispose方法中调用以下方法: -

        GC.SuppressFinalize(本);

      2. 所以我不确定这是否是Controller基类中Dispose()方法的默认实现的一部分,或者我需要在Dispose方法中显式调用垃圾收集器?

        由于

        修改 这是dispose方法为空的公共抽象类Controller代码: -

        enter image description here

2 个答案:

答案 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);
        }