一个简单的配置管理器(SettingManager)
? ? ? 在很多.net開發(fā)的項目中,我們幾乎都會使用到一些自定義的參數(shù),比如說第三方的配置參數(shù)之類的.
他們的特點是:1.系統(tǒng)全局 2,可以做成鍵值對(Dictionary).
? ? ?我們可以將這些參數(shù)放到Web.config,xml或者數(shù)據(jù)庫表中,當然部分不常變的可以直接寫在程序中.
為了方便我通常喜歡將他們統(tǒng)放在一個配置管理器中,然后希望別人使用時, 可以像使用AppSetings中的參數(shù)一樣
?
初看起來還是比較容易實現(xiàn),在ConfiguratonManager中定義一個公開屬性AppSettings就好了.
實現(xiàn)如下:
using System; using System.Collections.Generic; using System.Collections.ObjectModel; using System.Linq; using System.Text; using System.Threading.Tasks;namespace ConfigManager {public class ConfigurationContainer{private static ConfigurationContainer m_Instance = null;public static ConfigurationContainer Instance{get{if (m_Instance == null)m_Instance = new ConfigurationContainer();return m_Instance;}}private ConfigurationContainer(){}private ReadOnlyDictionary<string, string> _configuration;private Dictionary<string, string> _mutableConfiguration;public ReadOnlyDictionary<string, string> Configuration{get{//TODO:check is newest or not in database??if (_mutableConfiguration == null)Init();_configuration =new ReadOnlyDictionary<string, string>(_mutableConfiguration);return _configuration;}}public bool Add(string key, string value){bool bRet = false;if (!_mutableConfiguration.ContainsKey(key)){_mutableConfiguration.Add(key, value);bRet = true;}return bRet;}public bool Update(string key, string value){bool bRet = false;if (_mutableConfiguration.ContainsKey(key)){_mutableConfiguration[key] = value;bRet = true;}return bRet;}public bool Remove(string key){bool bRet = false;if (_mutableConfiguration.ContainsKey(key)){_mutableConfiguration.Remove(key);bRet = true;}return bRet;}//private bool ConfigurationAllowed(string key, string value)//{// // Put in your checks and balances// // here and return the appropriate result// return true;//}private void Init(){_mutableConfiguration = new Dictionary<string, string>();_mutableConfiguration.Add("key", "value");_mutableConfiguration.Add("key1", "value1");_mutableConfiguration["key2"] = "value2";}} } View Code?
ConfigurationContainer:using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks;namespace ConfigManager {public class ConfigManager{private static IReadOnlyDictionary<string, string> _AppSettings = null;public static IReadOnlyDictionary<string, string> Appettings{get{//initial ensurer the newest_AppSettings = ConfigurationContainer.Instance.Configuration;return _AppSettings;}}//Exception:Violence to Addpublic static void BeNaughtyWithConfiguration(){IDictionary<string, string> convertToReadWrite= (IDictionary<string, string>)_AppSettings;//ConfigElement element = convertToReadWrite["key"];//element.Value = "Haa Haa";//Console.WriteLine(element.Value);//Console.WriteLine(convertToReadWrite["key"]);//Console.ReadLine(); convertToReadWrite.Add("Key12345", "xsds");}public static bool Add(string key, string value){return ConfigurationContainer.Instance.Add(key, value);}public static bool Update(string key, string value){return ConfigurationContainer.Instance.Update(key, value);}public static bool Remove(string key){return ConfigurationContainer.Instance.Remove(key);}} } View Code最底層是一個單例模式,并封裝了字典的CRUD操作。
客戶端測試一下:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks;namespace ConfigManager {class Program{static void Main(string[] args){var settings = ConfigManager.Appettings;foreach(var item in settings){Console.WriteLine("key:{0},value:{1}",item.Key,item.Value);}var t1 = ConfigManager.Appettings["key1"];//test addConfigManager.Add("t","test");//var t2 = ConfigManager.Appettings;//updateConfigManager.Update("t","test123");//removeConfigManager.Remove("t");Console.ReadKey();}} } View Code?
好像也能運行。
那么,問題來了!測試代碼改一改,
//test not item in Dictionaryvar t2 = ConfigManager.Appettings["luckyhu"];代碼崩潰了,老兄!
其實上面的代碼能夠滿足一般的需求,但是對使用著來說,仍然不太方便.所以我和同事進一步優(yōu)化了上述代碼.
現(xiàn)在變得更加簡潔了.
public class SettingManager : Dictionary<string, string>{private static SettingManager _Settings = null;public static SettingManager Settings{get{if (_Settings == null)_Settings = new SettingManager();return _Settings;}}private SettingManager(){//Init Data//DataSoure:truely data here...for (int i = 0; i < 10; i++){var key = String.Format("key{0}", i);var value = String.Format("value{0}", i);if (!this.Keys.Contains(key))this.Add(key, value);}}public string this[string key]{get{if (!this.ContainsKey(key))return String.Empty;return base[key];}set{base[key] = value;}}public static bool GetBoolValue(string key){bool value = false;bool.TryParse(Settings[key], out value);return value;}public static int GetIntValue(string key){int value = 0;int.TryParse(Settings[key], out value);return value;}} View Code大家看到代碼簡潔了不少,有了以下改進:
1.代碼變少了
2.可以控制索引的返回結(jié)果了
3.更多的利用了Dictionary自身的特性,如CRUD
4.增加了自定義類型轉(zhuǎn)換方法
?總之,這些努力都是為了方便別人使用.
?
好吧,看看客戶端測試吧
測試結(jié)果是OK的
好了,這樣一個通用的配置管理器完成了, 當然有更多的需求,還可以對其進行擴展。歡迎大家不吝賜教 .
祝大家新年快樂,萬事如意! 2015,一起任性!
?
轉(zhuǎn)載于:https://www.cnblogs.com/lucky_hu/p/4198227.html
總結(jié)
以上是生活随笔為你收集整理的一个简单的配置管理器(SettingManager)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 恢复花呗使用资格技巧 人工无法进行干
- 下一篇: Hash散列算法解析