恐ろしさはさておき、静的変数が複数のクラスに散在している.NET Webアプリがある場合、それらをすべてnullに「クリア」する最も簡単な方法は何ですか。
頭から離れて、それはを使用してアプリケーションを再起動することになるでしょう
System.Web.HttpRuntime.UnloadAppDomain()
質問の背後にある理由-作成に費用がかかり、奇妙な場合にはリセットする必要がある非常に大きな辞書コレクションをいくつかキャッシュしています。
恐ろしさはさておき、静的変数が複数のクラスに散在している.NET Webアプリがある場合、それらをすべてnullに「クリア」する最も簡単な方法は何ですか。
頭から離れて、それはを使用してアプリケーションを再起動することになるでしょう
System.Web.HttpRuntime.UnloadAppDomain()
質問の背後にある理由-作成に費用がかかり、奇妙な場合にはリセットする必要がある非常に大きな辞書コレクションをいくつかキャッシュしています。
アンロードは最も簡単な方法のように聞こえますが、それほど頻繁に行うことは望ましくありません。率直に言って、私はこれを行うための日常的な要件について非常に疑わしいでしょう。
アンロードせずにそれを実行したい場合は、その影響を理解するためにケースバイケースで調べる必要があります。特に、静的コンストラクター/型初期化子/静的フィールド初期化子によって値に設定されたものを強制的にnullに設定すると、アプリケーションが完全に破損する可能性があります。
静的変数がWebアプリに適していることはめったにないことに注意してください。ただし、おそらくキャッシュを除きます(したがって、慎重に管理する必要があります)。
複数の静的変数ではなく、本当にこのようなデータがある場合は、疑似シングルトンとして役立つ状態クラスのインスタンス変数を見ることができます。データのクラスターごとにスワップする参照は1つだけです。
検討する価値があるかもしれない何かは、静的コードが自分自身を初期化するときに一度だけサブスクライブできるイベントをどこかに持っていて、必要なときにイベントをトリガーすることです。
myStaticData = new SomeExpensiveThreadSafeCacheDictionary();
GlobalKillSwitch.ResetCache += delegate { myStaticData.Clear(); };
私はこれを使います
public static void ResetAllStaticsVariables(Type type)
{
var fields = type.GetFields(BindingFlags.Static | BindingFlags.NonPublic | BindingFlags.FlattenHierarchy | BindingFlags.Public);
foreach (var fieldInfo in fields)
{
fieldInfo.SetValue(null, GetDefault(type));
}
}
public static object GetDefault(Type type)
{
if (type.IsValueType)
{
return Activator.CreateInstance(type);
}
return null;
}