在我的Application_Start中,我使用Unity-AutoRegistration工具配置Unity:
UnityFactory.Configure(config => config
.Include(If.ImplementsITypeName, Then.Register())
.ExcludeSystemAssemblies()
);
我的UnityFactory类是静态的.配置工作如下:
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类中的静态字段配置仍包含第一次提供的配置.所以班级本身并没有改变.
应用程序池被回收后,不会触发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();
}
并回答我的问题:
What is happening here? Why is Unity forgetting about all my classes?
当应用程序池循环使用时,程序集可能会从内存中释放.当再次需要它们时,它们会被重新加载.但是,由于它们似乎来自不同的文件,因此Unity无法知道它们实际上与以前实际上是相同的程序集,因此无法找到原始的类定义.
And is there an event I can subscribe to which allows me to know when the pool has been recycled?
显然,没有这样的事情.