应用程序池重新启动后缺少Unity配置

时间:2012-11-15 16:49:12

标签: c# iis-7 unity-container application-pool

在我的Application_Start我使用Unity-AutoRegistration工具配置Unity:

UnityFactory.Configure(config => config
    .Include(If.ImplementsITypeName, Then.Register())
    .ExcludeSystemAssemblies()
);

我的UnityFactory课程是静态的。 Configure的工作原理如下:

public static void Configure(Func<IAutoRegistration,IAutoRegistration> configuration)
{
    // Store the configuration to be able to apply it again when needed
    UnityFactory.configuration = configuration;

    // Create new UnityContainer
    container = new UnityContainer();

    // Apply configuration
    configuration(container.ConfigureAutoRegistration()).ApplyAutoRegistration();
}

它在IIS7下运行,并且在它启动时一切正常。

只要应用程序池被回收,它就会停止工作。配置以某种方式搞砸了,它无法再解析我的类了。但是,configuration类中的静态字段UnityFactory仍包含第一次提供的配置。所以班级本身并没有改变。

应用程序池被回收后,不会触发Application_Start方法,因此不会再次应用配置。

如果我设置断点并再次手动应用配置,则一切都可以正常工作。

这里发生了什么?为什么Unity忘记了我的所有课程?是否有我可以订阅的活动让我知道游泳池什么时候被回收?

1 个答案:

答案 0 :(得分:2)

显然,当应用程序池被回收时,会释放程序集,这会导致Unity无法在其中找到任何声明的类。

我已经设法通过专门加载Unity的程序集来解决这个问题。这样,即使应用程序池被回收,它们仍保留在内存中。

public static void Configure(Func<IAutoRegistration,IAutoRegistration> configuration)
{
    // Create new UnityContainer with auto registration
    container = new UnityContainer();
    var autoRegistration = container.ConfigureAutoRegistration();

    // Load assemblies
    var path = Path.Combine(System.AppDomain.CurrentDomain.BaseDirectory, "bin");
    foreach (string dll in Directory.GetFiles(path, "*.dll", SearchOption.AllDirectories))
    {
        autoRegistration.LoadAssemblyFrom(dll);
    }

    // Apply configuration
    configuration(autoRegistration).ApplyAutoRegistration();
}

回答我的问题:

  

这里发生了什么?为什么Unity忘记了我的所有课程?

当应用程序池回收时,程序集可能会从内存中释放。当再次需要它们时,它们会被重新加载。但是,由于它们似乎来自不同的文件,因此Unity无法知道它们实际上与以前实际上是相同的程序集,因此无法找到原始的类定义。

  

是否有我可以订阅的活动让我知道游泳池什么时候被回收?

显然,没有这样的事情。