每次我嘗試使用內置的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 GenerateDefault(字符串ConfigFileName)工廠方法,它將產生一個帶默認值的示例配置。
不要忘記檢查文件文件是否存在並將其加載到try/catch塊中。
更好的解決方案是使用DataContracts,它允許您序列化私有成員並提供支持不同版本的DataContracts的良好機制,但它稍微複雜一些。
把我的用戶界面設置放在DAL中會感覺很奇怪,因爲我會有很多不同的UI。目前我正在爲每個圖層分別創建一個.config文件,我不知道這是否是最佳做法 – e4rthdog
您可能會保留具體設置的範圍是特定的項目,但是有很多事情需要在不同的項目/層之間共享,因此設置應該獨立於項目。一個單獨的xml文件或一個帶有讀/寫/加載設置的庫項目。單獨設置類的單獨程序集是很好的選擇。 – Munawar
所以我可以爲每個項目設置一個靜態單例類。通過這種方式,我可以使用盡可能多的方式填充上層的數據。正確? – e4rthdog