Autofac实例注册的SingleInstance()是否在IIS AppDomain回收中存活?

时间:2015-07-29 12:27:47

标签: asp.net asp.net-mvc iis asp.net-web-api autofac

我一直在使用AutofacASP.NET Web APIASP.NET MVC进行整合。一切似乎都运行良好,除了我对注册为SingleInstance()的对象的生命周期有一些挥之不去的怀疑,更广泛地说是关于容器本身的生命周期。

例如,如果我按如下方式声明一个类:

public class Cache {
    private Dictionary<int, int> _internalCache = new Dictionary<int, int>();        
}

并将其注册为容器中的单实例:

var builder = new ContainerBuilder();
builder.RegisterType<Cache>.SingleInstance();
var container = builder.Build();

假设我在container中托管的ASP.NET MVCASP.NET Web API集成使用相同的IIS实例,容器和在其下注册的实例会发生什么什么时候AppDomain回收? _internalCache的内容会怎样?如果我在Cache回收之前和之后解决AppDomain,我仍会获得相同的实例吗?

1 个答案:

答案 0 :(得分:5)

回收 IIS应用程序池将重新启动 w3wp.exe 。回收后,所有内容都将重置,您将为Cache为每个应用程序池实例创建一个Cache实例。

顺便说一句,当您回收应用程序池时,IIS将:

  1. 启动一个新的应用程序池:将启动一个新的w3wp.exe
  2. 等待新的应用程序池启动:ASP.net将自行初始化,这是应该构建 Autofac 容器的时间
  3. 正常关闭第一个应用程序池。所有正在运行的请求都将在旧的应用程序池上完成,新的请求将被重定向到新的应用程序池。 (旧的应用程序池将在所有旧请求完成或超时后关闭)
  4. 当新的应用程序池启动时,另一个仍处于活动状态,因此可能有2个并发的Cache实例同时存在于2个不同的应用程序池中。