gpt4 book ai didi

c# - 正在卸载在单独的 DLL 中具有逻辑的 .NET Web 项目

转载 作者:行者123 更新时间:2023-11-30 12:48:35 25 4
gpt4 key购买 nike

我有一个 .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

}

最佳答案

不确定它是否解决了您的问题,但在 Web 应用程序内部使用静态类特别困难。具有静态方法的类(静态或基于实例的)很好,但静态属性和字段会造成严重破坏。您的数据将在 IIS 内跨线程共享,并且数据将以看似随机的顺序被覆盖。

如果您尝试共享静态数据,请将该数据放入您的 web.config 或将其缓存在服务器上。如果数据是读/写的,把它放在一个基于实例的对象中。

关于c# - 正在卸载在单独的 DLL 中具有逻辑的 .NET Web 项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13688292/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com