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



在我的Application_Start中,我使用Unity自动注册工具配置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忘记了我所有的课程?有没有我可以订阅的活动,让我知道游泳池何时被回收?

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

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

令人惊讶的是,根本没有这样的东西。

最新更新