Ren*_*ink 5 c# iis-7 unity-container application-pool
在我中,Application_Start
我使用Unity-AutoRegistration工具配置Unity:
UnityFactory.Configure(config => config
.Include(If.ImplementsITypeName, Then.Register())
.ExcludeSystemAssemblies()
);
Run Code Online (Sandbox Code Playgroud)
我的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();
}
Run Code Online (Sandbox Code Playgroud)
它在IIS7下运行,并且在启动时一切正常。
每当回收应用程序池时,它将停止工作。该配置以某种方式弄乱了,它不再能够解析我的类。然而,静态字段configuration
的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();
}
Run Code Online (Sandbox Code Playgroud)
并回答我的问题:
这里发生了什么?为什么 Unity 忘记了我的所有课程?
当应用程序池回收时,程序集可能会从内存中释放。当再次需要它们时,它们会被重新加载。然而,由于它们似乎来自不同的文件,Unity 无法知道它们实际上是与以前相同的程序集,因此无法找到原始的类定义。
是否有一个我可以订阅的事件可以让我知道池何时被回收?
显然,不存在这样的事情。
归档时间: |
|
查看次数: |
816 次 |
最近记录: |