データベースからデータをキャッシュするクラスがいくつかあります。これらのクラスには、静的コンストラクターが呼び出されるときにデータがロードされます。
まだ初期化されていないクラスを除いて、これらすべてのクラスで静的な Reload メソッドを呼び出す必要があります。
例: 市はデータベースからデータをキャッシュします
public class City
{
public City Get(string key)
{
City city;
FCities.TryGetValue(key, out city);
return city;
}
private static Dictionary<string, City> FCities;
static City()
{
LoadAllCitiesFromDatabase();
}
public static void Reload()
{
LoadAllCitiesFromDatabase();
}
private static void LoadAllCitiesFromDatabase()
{
// Reading all citynames from database (a very slow operation)
Dictionary<string, City> loadedCities = new Dictionary<string, City>();
...
FCities = loadedCities;
}
}
問題は、City がまだ使用されていない可能性があり (このサービスでは使用されていない可能性があります)、データベースからそれをロードする理由がないことです。
私の reload all メソッドは次のようになります。
public static class ReloadAll
{
public static void Do()
{
foreach (Type classType in AppDomain.CurrentDomain.GetAssemblies().SelectMany(a => a.GetTypes()).Where(t => t.IsClass && !t.IsAbstract))
{
MethodInfo staticReload = classType.GetMethods().FirstOrDefault(m => m.IsStatic && m.IsPublic && m.ReturnType == typeof(void) && m.Name == "Reload" && m.GetParameters().Length == 0);
if (staticReload != null)
{
if (StaticConstructorHasBeenCalled(classType))
staticReload.Invoke(null, null);
}
}
}
private bool StaticConstructorHasBeenCalled(Type classType)
{
// How do I check if static constructor has been called?
return true;
}
}
StaticConstructorHasBeenCalled の実装について少し助けが必要です。