ConfigurationManager姿勢快閃
最近一個祖?zhèn)鞔a是使用.NET Fx寫就的,我在使用控制臺程序獲取配置時有些折騰。
下面記錄一些管理配置文件的姿勢:
ConfigurationManager用于在客戶機應(yīng)用程序中獲取配置信息;對于web項目,請使用WebConfigurationManager類。
ConfigurationManager使用姿勢
添加app.config文件
???
??"ProjectName"?value="cvg.java.api.productcenter"?/>
??
??
????"DBConnection"?connectionString="Data?Source=(LocalDB)\v11.0;Initial?Catalog=WingtipToys;Integrated?Security=True;Pooling=False"/>
??
注意:編譯之后app.config配置節(jié)會進(jìn)入可執(zhí)行文件的配置文件
Demo.exe.configConfigurationManager.AppSettings["key1"]、ConfigurationManager.ConnectionStrings["DBConnection"]用于從應(yīng)用的默認(rèn)配置中獲取程序配置、連接字符串配置, 這也是ConfigurationManager最常規(guī)的用法。如何讀取外部配置?
? ? ?將所有配置信息放在一個配置文件顯得非?;靵y,特別是[密碼管理]的時候, 可能會劃分多個配置文件。ConfigurationManager支持項目中創(chuàng)建另外的配置文件。
??------?app.config文件-----
?"DBConnectionStrings.config"?/>
-----?DBConnectionString.config文件,?這里已經(jīng)不需要configuration頂級配置節(jié)----?
"1.0"?encoding="utf-8"?>
?"DBConnection"?connectionString="Data?Source=(LocalDB)\v11.0;Initial?Catalog=WingtipToys;Integrated?Security=True;Pooling=False"??/>
附加的這個文件不會進(jìn)Demo.exe.config文件,可以想象到,當(dāng)需要隱藏該文件配置,可以不把該文件加入代碼管理。
ConfigurationManager支持Machine,User,Exe三個級別的配置文件, 可以通過 ExeConfigurationFileMap加載特定位置的配置文件。
????var?configFileMap?=?new?ExeConfigurationFileMap()
????{
????????ExeConfigFilename?=?@"E:\Test\WpfApp2\bin\Debug\PositionConfig.config"
????};
????var?v?=?ConfigurationManager.OpenMappedExeConfiguration(configFileMap,?ConfigurationUserLevel.None);
我們順便看下微軟是如何編寫工具庫文件,ConfigurationManager 是一個靜態(tài)類,靜態(tài)構(gòu)造函數(shù),
在使用靜態(tài)方法 AppSettings["key1"]索引配置時,必須先確保配置文件已經(jīng)就緒,注意下面的PrepareConfigSystem==>EnsureConfigurationSystem方法
??????public?static?object?GetSection(string?sectionName)
????????{
????????????if?(string.IsNullOrEmpty(sectionName))
????????????{
????????????????return?null;
????????????}
????????????PrepareConfigSystem();
????????????return?s_configSystem.GetSection(sectionName);
????????}
????????
??????????private?static?void?PrepareConfigSystem()
????????{
????????????if?(s_initState?????????????{
????????????????EnsureConfigurationSystem();
????????????}
????????????if?(s_initError?!=?null)
????????????{
????????????????throw?s_initError;
????????????}
????????}
使用了一個狀態(tài)字段來表征初始化過程, 注意這里使用了一個lock防止并發(fā)下被多次初始化
?????private?static?void?EnsureConfigurationSystem()?{
????????????//?If?a?configuration?system?has?not?yet?been?set,?
????????????//?create?the?DefaultConfigurationSystem?for?exe's.
????????????lock?(s_initLock)?{
????????????????if?(s_initState?????????????????????s_initState?=?InitState.Started;
????????????????????try?{
????????????????????????try?{
????????????????????????????s_configSystem?=?new?ClientConfigurationSystem();
????????????????????????????s_initState?=?InitState.Usable;
????????????????????????}
????????????????????????catch?(Exception?e)?{
????????????????????????????s_initError?=?new?ConfigurationErrorsException(SR.GetString(SR.Config_client_config_init_error),?e);
????????????????????????????throw?s_initError;
????????????????????????}
????????????????????}
????????????????????catch?{
????????????????????????s_initState?=?InitState.Completed;
????????????????????????throw;
????????????????????}
????????????????}
????????????}
????????}
本文算是簡短的技術(shù)快閃,記錄了ConfigurationManager 的使用姿勢和微軟工具庫的一般開發(fā)模式。
