我有一个 .NET Web 应用程序,它为许多非 UI 代码使用单独的类库。在这个库中有一个静态类,用于站点范围的配置信息。它在Application_Start
事件期间被初始化。
我遇到了一个问题,因为这个关键的静态对象似乎间歇性地失去了它的状态——我认为是因为 DLL 出于某种原因正在被卸载。它可能几天都不会发生,也可能一天发生几次。但是,这种情况在应用程序没有重新启动的情况下发生,因此结果是所有初始化的数据Application_Start
都丢失了,导致各种问题。回收应用程序池或以其他方式重新启动应用程序可以修复它。
在我弄清楚发生了什么之后,我更改了代码,以便类库中的配置对象使用静态构造函数初始化自身,而不是在应用程序启动阶段。这引入了一些其他不值得讨论的复杂性,但我可以让它工作——我只是认为这是一个糟糕的架构,不应该是必要的。
Application_Start
在应用程序的生命周期内保持其状态期间,我是否应该能够依赖加载的外部 DLL 中的静态对象?显然我不能 - 而且我不太清楚为什么 - 但我想知道我是否应该寻找 DLL 正在卸载的原因,或者只是接受它可以并且从不编写依赖于外部静态对象的代码主应用程序 DLL 保持其值。
这是 Application_Start 的样子。
Application_Start() {
// asp.net routing
ConfigureRoutes();
// LF is the static config object in an outside dll
// the LFFactory object implements session & database stuff that's context-specific
// (e.g. this is initialized with a different implementation when testing).
LF.Initialize(new SiteEnvironment.Web.LFFactory());
// add custom view engine...
ViewEngines.Engines.Clear();
... blah blah
}