過去に何度か、データをコードに保存したいと思っていました。これはめったに変更されないデータであり、データベースへのアクセスが不可能、実用的、または望ましくない場所で使用されます。小さな例は、国のリストを保存することです。そのためには、次のようなことができます。
public class Country
{
public string Code { get; set; }
public string EnglishName {get;set;}
}
public static class CountryHelper
{
public static List<Country> Countries = new List<Country>
{
new Country {Code = "AU", EnglishName = "Australia"},
...
new Country {Code = "SE", EnglishName = "Sweden"},
...
};
public static Country GetByCode(string code)
{
return Countries.Single(c => c.Code == code);
}
}
データセットが比較的小さく、オブジェクトが非常に単純だったため、過去にこれをやめました。現在、私はより複雑なオブジェクト(それぞれ5〜10個のプロパティ、一部のプロパティは辞書)を持ち、合計で約200個のオブジェクトを持つものを扱っています。
データ自体はめったに変更されず、変更されても実際にはそれほど重要ではありません。そのため、次のリリースバージョンに組み込むことはまったく問題ありません。
T4またはERBまたはその他のテンプレートソリューションを使用して、データソースをアセンブリに静的に格納されるものに変換することを計画しています。
私のオプションは
- データをXMLで保存します。XMLファイルをアセンブリリソースとしてコンパイルします。必要に応じてデータをロードし、ロードしたデータを辞書に保存して、繰り返し使用するパフォーマンスを向上させます。
- 起動時に初期化される何らかの種類の静的オブジェクトを生成します。
オプション1のパフォーマンスへの影響を理解していると確信しています。少なくとも、私の予想では、優れたパフォーマンスは得られません。
オプション2については、何をすべきかわかりません。このデータをC#コードに実際に保存する最適な方法と、それを初期化する最適な方法を知るには、.NETフレームワークの内部について十分に知りません。System.Globalization.CultureInfo.GetCulture(name)
これが実際に私が望むものに非常に類似したワークフローであるので、どのように機能するかを見るために。残念ながら、そのトレイルはで終了したextern
ため、ヒントはありません。私の例のように、すべてのデータで静的プロパティを初期化していますか?または、次のように、オンデマンドでオブジェクトを作成してからキャッシュする方が良いでしょうか?
private static readonly Dictionary<string, Country> Cache = new Dictionary<string,Country>();
public static Country GetByCode(string code)
{
if (!Cache.ContainsKey(code))
return Cache[code];
return (Cache[code] = CreateCountry(code));
}
internal static Country CreateCountry(string code)
{
if (code == "AU")
return new Country {Code = "AU", EnglishName = "Australia"};
...
if (code == "SE")
return new Country {Code = "SE", EnglishName = "Sweden"};
...
throw new CountryNotFoundException();
}
静的メンバーで一度に作成する利点は、LINQなどを使用してすべてのオブジェクトを調べ、必要に応じてクエリを実行できることです。これを行うと起動時のパフォーマンスが低下すると思われますが。誰かがこれを経験し、意見を共有できることを望んでいます!