C# Autofac-是否需要在MVC global.asax中手动处理IContainer?
我似乎无法在文档或stackOverflow中找到这个问题的答案(尽管我可能忽略了它)。我很好奇是否应该手动处理ContainerBuilder提供的IContainer 以下是Rememory.Web的代码示例: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
//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方法中执行更多操作(例如,对数据库进行一些最终日志记录),那么代码将不会运行。