C# Autofac-是否需要在MVC global.asax中手动处理IContainer?

C# Autofac-是否需要在MVC global.asax中手动处理IContainer?,c#,asp.net-mvc,autofac,C#,Asp.net Mvc,Autofac,我似乎无法在文档或stackOverflow中找到这个问题的答案(尽管我可能忽略了它)。我很好奇是否应该手动处理ContainerBuilder提供的IContainer 以下是Rememory.Web的代码示例: //etc.. IContainer container = builder.Build();//returns IDisposable instance DependencyResolver.SetResolver(new AutofacDependencyResolver(con

我似乎无法在文档或stackOverflow中找到这个问题的答案(尽管我可能忽略了它)。我很好奇是否应该手动处理ContainerBuilder提供的IContainer

以下是Rememory.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();
    }
}

如果我忽略了什么,请告诉我正确的文档,谢谢

在处理一次性物品时,通常情况下,您应该在处理完物品后立即将其处理掉。所以我会说是的,明确地说出来。文件和样品应提及这一点

如果不手动处置容器,则在卸载appdomain后的一段时间内,GC将释放容器(以及包含的任何实例)

注意:正如@Steven提到的,
Dispose
方法在垃圾收集期间不会被调用。因此,将不会执行
Dispose
方法中的任何逻辑。因此,处理容器是否具有任何意义取决于容器所持有的实例。同样,在
Application\u End
中显式调用
Dispose
,将确保不会丢失此类逻辑


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

这不完全正确。如果AppDomain死亡,运行时将运行所有仍需要终结的对象的所有终结器。因此,这意味着任何非托管资源(文件句柄、db连接、对本机内存的引用、GDI+映像)都将被清除。但是垃圾收集器不会为您调用任何
Dispose
方法。因此,如果您在终结器之外的dispose方法中执行更多操作(例如,对数据库进行一些最终日志记录),那么代码将不会运行。