組み込みのapp.configファイルを使用しようとするたびに、組み込みのソリューションの欠点のために、独自の構成ソリューションを実装することになりました。カスタムxmlベースのソリューションの実装は複雑ではありません。実はとても簡単です。
この基本クラスをソリューションに入れるだけです。
[Serializable]
public abstract class ConfigBase<DerivedT> where DerivedT : ConfigBase<DerivedT>
{
protected string FilePath;
public string FileVersion;
public ConfigBase() { }
public void Save()
{
XmlSerializer xs = new XmlSerializer(GetType());
using (StreamWriter writer = File.CreateText(FilePath))
{
xs.Serialize(writer, this);
}
}
public static DerivedT Load(string filename)
{
XmlSerializer xs = new XmlSerializer(typeof(DerivedT));
using (StreamReader reader = File.OpenText(filename))
{
DerivedT config = (DerivedT)xs.Deserialize(reader);
config.FilePath = filename;
return config;
}
}
}
次に、次のように構成ファイルを作成できます。
public class Config : ConfigBase<Config>
{
// put your variables here like below
public string DatabaseConnectionString;
public int numberOfConnections;
}
次のように使用します。
// Load it like this
Config config = Config.Load(ConfigFileName);
// Save it like this
config.Save();
構成ファイル内で、プロパティ、配列、およびその他の複雑な構造を自由に使用してください。すべて自動的にシリアル化されます。特定のフィールド/プロパティをシリアル化したくない場合は、XmlIgnore属性を使用します。このソリューションを使用すると、さまざまな構成ファイルを作成できますが、それらをロードおよび保存するための単一のメカニズムがあります。
Configファイル内にpublicstaticConfig GenerateDefault(string ConfigFileName)ファクトリメソッドを含めることがよくあります。これにより、デフォルト値を使用してサンプル構成が生成されます。
ファイルファイルが存在するかどうかを確認し、try/catchブロック内にロードすることを忘れないでください。
さらに優れたソリューションは、DataContractsを使用することです。これにより、プライベートメンバーをシリアル化し、さまざまなバージョンのDataContractsをサポートするための優れたメカニズムが提供されますが、少し複雑です。