多くの非 UI コードに別のクラス ライブラリを使用する .NET Web アプリケーションがあります。このライブラリには、サイト全体の構成情報に使用される静的クラスがあります。Application_Start
イベント中に初期化されます。
この重要な静的オブジェクトが断続的に状態を失っているように見えるという問題があります.DLLが何らかの理由でアンロードされているためだと思います. 何日も起こらないかもしれませんし、1日に数回起こるかもしれません。ただし、これはアプリケーションを再起動せずに発生するため、その結果、初期化中に初期化されたすべてのデータ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
}