自定義應用程序配置 為了讓自己編寫的程序更加具有靈活性,往往需要把一些信息放置到程序的外部,,等到程序運行時,,根據(jù)讀入的數(shù)據(jù)的不同,可能讓程序具有不同的表現(xiàn),。存放這些信息的文件就稱為應用程序的配置文件,,有的人將配置信息寫入ini的文件中,有的應用程序把這些信息寫入數(shù)據(jù)庫,。在.Net中,,一般采用標準的XML文件作為配置文件。不同的應用程序配置文件的名稱不同,。在.Net中web程序的配置文件一般叫web.config,,應用程序的配置文件一般叫app.config。 由于配置文件就是一個XML文件所以稱文件中的每一個結點為元素,。每個XML中的元素都對應一個配置信息,,所以又稱元素在配置信息中為配置元素,如果一個配置元素中還包含其他的配置元素,,那么就稱這個配置元素為配置節(jié),。 下面具體看一個.Net中具體使用的配置文件,觀察一下配置文件的格式,。為了能讓大家看清楚配置文件的組成,,對文中的一些內容進行了省略,用“…”來表示,。 <?xml version="1.0"?> <configuration> <configSections> <section name="script" type="...ScriptingSection"/> <sectionGroup name="webServices" type="...SectionGroup"> <section name="roleService" type="...Section"/> </sectionGroup> </configSections> <appSettings> <add key="DAL" value="SQLDAL"/> <add key="BLL" value="BLL"/> </appSettings> <connectionStrings> <add name="northWindConnectionString" connectionString="Data ..." /> </connectionStrings> </configuration> 從上面可以看出,,一個配置文件具有根元素configuration,與命名空間System.Configuration中的類Configuration相對應,。在根元素configuration中包含的內容一般分為兩個部分,。第一部分位于configSections中,稱為配置節(jié)的聲明部分,。剩下的部分就稱為配置節(jié)區(qū)域,,里面包含有很多的配置信息,每一個配置信息,,稱為一個配置元素或者配置節(jié),,配置節(jié)還可以包含配置節(jié),。像上面文件中 <appSettings> <add key="DAL" value="SQLDAL"/> <add key="BLL" value="BLL"/> </appSettings> 就是一個配置元素,。相對應的connectionStrings是另外的一個配置元素,。在配置文件中配置區(qū)域的每一個配置元素或者配置節(jié)都需要在configSections先聲明,然后在后面的配置信息中才能使用,。否則,,程序會提示“不能識別的配置元素”的提示。這個就像編程中使用的變量首先要聲明一樣,。 在配置節(jié)的聲明部分,,比如<section name="script" type="...ScriptingSection"/>中,name就表示下面將要使用到的配置節(jié)的名稱,。type就表示對這個配置信息的處理程序,,如果使用的程序集是私有程序集時 type通常由兩部分組成,由逗號“,”分隔,,前半部分是類型名稱,,后半部分是程序集名稱。如果是公有程序集(),,則需要提供publicKey,。比如一個使用了強命名程序集的完整聲明為:<section name="roleService" type="System.Web.Configuration.ScriptingRoleServiceSection, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" /> configSections與.NET Framework中的configSections元素相對應,在configSections元素中可以包含在表11-5中列出的子元素,。
如果配置文件中包含 configSections 元素,,則 configSections 元素必須是 configuration 元素的第一個子元素。 在配置文件中的配置節(jié)在System.Configuration命名空間中有相應的類與之對應,,這樣做的目的是提供對這些節(jié)的操作,,configuration與類Configuration相對應,配置節(jié)對應的類使用ConfigurationSection類來表示,??梢允褂迷擃愄峁┑?/span>GetSection或者GetSectionGroup方法來讀取配置文件中的信息。而ConfigurationManager類封裝了對這些配置節(jié)的操作,,并且該類還具有兩個屬性,AppSettings與ConnectionStrings,,這兩個屬性分別與配置文件中的appSettings與connectionStrings配置節(jié)相對應,,appSettings返回一個NameValueCollection類,而connectionStrings返回一個ConnectionStringSettingsCollection類,。根據(jù)上面講解的知識,,不但能夠讀取.NET Framework中已經(jīng)定義好的內置結點的信息,,也可以自定義結點,。 11.4.1使用.Net內置結點和.Net內置處理程序 在目錄InElementAndMethod中添加一個控制臺應用程序InElementAndMethod,,在該應用程序中,,添加一個配置文件,然后將配置文件中的信息打印出來,。 配置文件的內容: <?xml version="1.0"?> <configuration> <!-- 使用.Net內置的結點和處理程序 --> <appSettings> <add key="Name" value="TraceFact.Net"/> <add key="Version" value="v1.0.08040301" /> <add key="Language" value="Chinese" /> </appSettings> </configuration> 在main函數(shù)中讀取這些信息,,并打印出來。 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Configuration;//手工添加
namespace InElementAndMethod { class Program { static void Main(string[] args) { string Name = ConfigurationManager.AppSettings["Name"]; string Language = ConfigurationManager.AppSettings["Language"]; string Version = ConfigurationManager.AppSettings["Version"]; Console.WriteLine("名稱:{0},,版本:{1},,語言:{2}", Name, Version, Language); Console.ReadKey();
} } } 由于控制臺應用程序并不包含System.Configuration.dll程序集,所以如果要使用ConfigurationManager類,,必須首先在項目中添加該引用,。 程序的運行結果為:名稱:TraceFact.Net,版本:v1.0.08040301,,語言:Chinese 大家在配置文件App.config中并沒有看到configSections 配置節(jié)聲明部分,,而是直接包含了appSettings配置節(jié),依然能使用appSettings配置節(jié),,并沒有出現(xiàn)“未識別的配置元素”的異常,,那么現(xiàn)在在配置文件中再添加一個自己定義的配置節(jié)??匆幌聲霈F(xiàn)什么樣的問題,。 新添加的配置節(jié) <VS2008> <add key="Year" value="2008"/> <add key="Company" value="MicroSoft"/> </VS2008> 重新編譯程序,會看到圖11-24的信息 圖11-24 運行程序會出現(xiàn)圖11-25的異常 圖11-25 為什么appSettings配置節(jié)都沒有問題,,而VS2008就不行呢,?這是因為appSettings是系統(tǒng)內部定義的結點,在系統(tǒng)內有一個文件machine.config,,該文件主要設置一些具有具有全局方面的設置,,以提供全局服務。該文件一般在C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\CONFIG目錄中,,打開該文件,,可以看到圖11-26所示的信息。 圖11-26 雖然在程序InElementAndMethod的配置文件中沒有明確的聲明appSettings配置節(jié),,沒有指定它在.NET中的處理程序,,但是在machine.config中已經(jīng)提前聲明了,所以在程序中能直接使用。能不能仿照appSettings配置節(jié)的聲明,,在自己的程序中也聲明一下,,是不是自己定義的配置節(jié)也就能夠使用了呢? 將machine.config文件中關于appSettings配置節(jié)的聲明部分,,拷貝到App.config文件中,。將name改為“VS2008”,然后在main函數(shù)中輸入下列內容,。 string Year = ConfigurationManager.GetSection("Year").ToString(); string Company = ConfigurationManager. .GetSection("Company") ToString(); 仍然不能運行,,原因在什么地方呢,? 11.4.2使用自定義結點和.Net內置處理程序 上面示例中,,自己寫了一個VS2008的配置節(jié)結點,然后仿照appSettings配置節(jié)的聲明部分,,在應用程序的配置文件也進行了聲明,,可是依然不能使用,原因在于聲明部分的type指出的類型上面,。VS2008聲明的類型是System.Configuration.AppSettingsSection,,這個數(shù)據(jù)集是為appSettings配置節(jié)專門編寫的處理程序。所以在VS2008配置節(jié)中不能使用,,現(xiàn)在需要提供自己的處理VS2008配置節(jié)的處理程序,。 在.Net中已經(jīng)提供了3個處理配置節(jié)的處理程序,它們是System.Configuration.SingleTagSectionHandler,、 System.Configuration.DictionarySectionHandler,、 System.Configuration.NameValueSectionHandler。
System.Configuration.SingleTagSectionHandler,,只能夠處理形如 <VS008 Year="2008" Company="MicroSoft"/>這樣的標簽,。 System.Configuration.NameValueSectionHandler就能夠處理 <VS2008> <add key="Year" value="2008"/> <add key="Company" value="MicroSoft"/> </VS2008> 這樣的配置節(jié),其實ConfigurationManager.AppSettings 返回的就是一個NameValueCollection類(表示可通過鍵或索引訪問的關聯(lián)String類型的鍵和String類型的值的集合,,在命名空間System.Collections.Specialized),。為了演示這兩種處理程序,修改App.config,,如下: <?xml version="1.0"?> <configuration> <!-- 使用.Net內置的結點和處理程序 --> <configSections> <section name="VS2008_1" type="System.Configuration.SingleTagSectionHandler, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"/> <section name ="VS2008_2" type="System.Configuration.NameValueSectionHandler,System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"/> </configSections> <appSettings> <add key="Name" value="TraceFact.Net"/> <add key="Version" value="v1.0.08040301" /> <add key="Language" value="Chinese" /> </appSettings> <VS2008_1 Year="2008" Company="MicroSoft"/> <VS2008_2> <add key="Year" value="2008"/> <add key="Company" value="MicroSoft"/> </VS2008_2> </configuration> 讀取配置文件信息的完整的代碼如下: using System; using System.Collections; using System.Linq; using System.Text; using System.Configuration;//手工添加,,用到ConfigurationManager using System.Collections.Specialized;//手工添加,用到NameValueCollection
namespace InElementAndMethod { class Program { static void Main(string[] args) { string Name = ConfigurationManager.AppSettings["Name"]; string Language = ConfigurationManager.AppSettings["Language"]; string Version = ConfigurationManager.AppSettings["Version"]; Console.WriteLine("名稱:{0},,版本:{1},,語言:{2}", Name, Version, Language); //采用SingleTagSectionHandler處理程序,得到哈希表 Console.WriteLine("采用SingleTagSectionHandler處理程序."); Hashtable VS2008_1 =(Hashtable)ConfigurationManager.GetSection("VS2008_1"); Console.WriteLine("Year:{0},,Company:{1}", (string)VS2008_1["Year"], (string)VS2008_1["Company"]); Console.WriteLine("采用NameValueSectionHandler處理程序."); //采用NameValueSectionHandler處理程序,,得到NameValueCollection NameValueCollection VS2008_2 = (NameValueCollection)ConfigurationManager.GetSection("VS2008_2"); foreach (string key in VS2008_2.Keys) { Console.WriteLine("{0}={1}", key, VS2008_2[key]); } Console.ReadKey(); } } } 運行程序,結果是: 名稱:TraceFact.Net,,版本:v1.0.08040301,,語言:Chinese 采用SingleTagSectionHandler處理程序. Year:2008,,Company:MicroSoft 采用NameValueSectionHandler處理程序. Year=2008 Company=MicroSoft |
|