在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上看到容器正在明确处理。
很好,但这真的有必要吗?
答案 0 :(得分:2)
很好,但是真的有必要吗?
是的,这是最好的做法。完成后处理所有IDisposable实例。
我们不是在谈论即将以任何方式结束的Web应用程序 案件? 当然,这意味着所有未处置的对象仍然会被驱逐,所以会调用Dispose吗? 以这种方式明确调用处置是否有任何正当理由或好处?
优点是,Disposing将禁止最终化(如果容器已实现最终化)。因此,垃圾收集器会尽快处理它,因为它不必进入终结队列。
注意:
并且还要注意,当您处置Autofac LifetimeScope
时,它将为所有IDisposable实例执行Dispose
。例如,如果您使用Autofac创建了container
并且在完成后处理了Autofac LifeTimeScope
,则可能不必手动处理container
。