【问题标题】:Unity configuration missing after application pool restart应用程序池重新启动后缺少 Unity 配置
【发布时间】:2012-11-04 08:02:54
【问题描述】:

在我的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 下运行,启动时一切正常。

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

应用池回收后不会触发Application_Start方法,所以不会再次应用配置。

如果我设置断点并再次手动应用配置,一切都会再次运行。

这里发生了什么?为什么 Unity 会忘记我的所有课程?是否有我可以订阅的事件让我知道池何时被回收?

【问题讨论】:

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


    【解决方案1】:

    显然,当应用程序池被回收时,程序集被释放,这导致 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 无法知道它们实际上是与以前相同的程序集,因此无法找到原始类定义。

    有没有我可以订阅的事件让我知道池何时被回收?

    显然,没有这样的事情。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-16
      • 2010-09-19
      • 2012-03-28
      • 2011-10-17
      • 2015-07-27
      • 1970-01-01
      相关资源
      最近更新 更多