如果它仍在结束,是否有必要在Application_End上处理?

时间:2015-12-02 04:43:38

标签: c# asp.net-mvc asp.net-web-api autofac

在Web或Api解决方案中处理像Autofac这样的IOC容器时,你会看到很多这样的瑕疵代码:

protected void Application_Start()
{
    ///etc..
    this.container = builder.Build();//returns IDisposable instance
    DependencyResolver.SetResolver(new AutofacDependencyResolver(container));
    //etc..
}

protected void Application_End()
{
    container.Dispose();
}

在Application_End上看到容器正在明确处理。

很好,但这真的有必要吗?

  • 我们不是在谈论即将以任何方式结束的Web应用程序 案件?
  • 当然,这意味着将为所有人调用Dispose 未处置的物体仍在四处乱窜?
  • 有没有正当理由 或者以这种方式明确地调用处置有益吗?

1 个答案:

答案 0 :(得分:2)

  

很好,但是真的有必要吗?

是的,这是最好的做法。完成后处理所有IDisposable实例。

  

我们不是在谈论即将以任何方式结束的Web应用程序   案件?   当然,这意味着所有未处置的对象仍然会被驱逐,所以会调用Dispose吗?   以这种方式明确调用处置是否有任何正当理由或好处?

优点是,Disposing将禁止最终化(如果容器已实现最终化)。因此,垃圾收集器会尽快处理它,因为它不必进入终结队列。

注意:

并且还要注意,当您处置Autofac LifetimeScope时,它将为所有IDisposable实例执行Dispose。例如,如果您使用Autofac创建了container并且在完成后处理了Autofac LifeTimeScope,则可能不必手动处理container