2014-10-09 68 views
2

我似乎无法找到一个答案,在文档或计算器这个问题(虽然我可能忽略了它)。我很好奇,是否应该手动处理由ContainerBuilder提供的IContainer?Autofac - 我需要在MVC global.asax中手动处理IContainer吗?

下面是Remember.Web一个代码示例:

//etc.. 
IContainer container = builder.Build();//returns IDisposable instance 
DependencyResolver.SetResolver(new AutofacDependencyResolver(container)); 
//etc.. 

,但我很好奇,如果它应该是这样的:

public class MvcApplication : HttpApplication 
{ 
    private IContainer container;//not necessary..? 

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

请你点我到正确的文档,如果我俯视着东西,谢谢!

回答

4

当使用一次性的工作,该模式是,你总是应该尽快处置的对象作为你用它做。所以我会说是,明确表示它。文件和样品应该提到这一点。

如果不手动配置储藏,它会被释放在AppDomain被卸载后,由GC(以及任何包含的情况下)一段时间。

注意: as @Steven提到,Dispose方法在垃圾回收期间不会被调用。因此,您可能在Dispose方法中执行的任何逻辑都不会执行。因此,处置容器是否具有任何意义取决于容器所拥有的实例。同样,明确地调用Application_End中的Dispose将确保没有这样的逻辑丢失。

也就是说,如果你在你的容器需要处理服务,您可能希望这些注册移动请求范围。这确保了一次性实例的生存时间与请求一样长。请求生命周期范围由Autofac集成模块处理,因此您不需要执行任何操作来执行清理。

+0

这是不完全正确。如果AppDomain死亡,运行时将运行所有仍需要最终确定的对象的所有终结器。所以这意味着任何非托管资源(文件句柄,db连接,对本机内存的引用,GDI +映像)都会被清除。但垃圾收集器不会为您调用任何“Dispose”方法。因此,如果你在一个不在终结器中的dispose方法中做更多事情(例如对数据库进行一些最终的记录),那么代码将无法运行。 – Steven 2014-10-09 21:04:35

+1

@Steven - 谢谢,你真是太棒了。我澄清了这一点。 – 2014-10-10 10:08:18

相关问题