关于.Net2.0下配置架构的使用
上次用到配置文件,就花了一些時間研究了一下.Net2.0下的配置文件架構,當時感覺確實很強大,完善,但看的有些頭暈.迷迷糊糊把實現了要求,就沒有再深入研究.
最近,想在配置文件里實現一個復雜的配置,多層次嵌套的配置文件,再把.Net中的配置文檔研究了一下,經過這兩次的研究,終于徹底搞清楚了。在博客園里已經看到了一篇文章提到了新的配置的研究,地址在這里 http://www.cnblogs.com/Xrinehart/archive/2005/12/03/289978.html?疾風 風行者。文中提到了幾個問題,我先補充一下。
引用:
OpenMappedExeConfiguration()有兩種重載,我只嘗試成功了上述這種,另外一種說是可以從指定配置文件中得到配置對象,但我沒成功過,誰要是搞明白了,記得告訴我下。
?
1???ExeConfigurationFileMap?filemap?=?new?ExeConfigurationFileMap();2???filemap.ExeConfigFilename?=?AppDomain.CurrentDomain.SetupInformation.ApplicationBase+"schema.config";
3???Configuration?config;
4???config?=?ConfigurationManager.OpenMappedExeConfiguration(filemap,?ConfigurationUserLevel.None);
5
6
?
以上這個方法就可以打開任意的配置文件。
引用:
請教一下,如果有類似下面的樹型結構,有沒有好的方法嗎?
<job name="all">
<job name="power" command="power on"/>
<job name="test tv">
<job name="step1.1" command="turn on tv" />
<job name="step1.2" command="turn off tv" />
這個功能是完全可以實現的。方法如下
示例如下:
??[ConfigurationProperty("jobs")]
??[ConfigurationCollection(typeof(JobCollection),
??????????? AddItemName="job")]
??public JobCollectionSchemaCollection
??{
???get
???{
????return (JobCollection)this["jobs"];
???}
???set
???{
????this["jobs"] = value;
???}
??}
AddItemName,只要設置了AddItemName這個屬性,顯示出來的配置文件就是你要求的那樣了。從這里也可以看出.Net的架構非常全面,很多功能可能我們都還沒有用起來。
我是從System.Configuration命名空間開始研究的。從使用架構的角度,我著重研究了以下幾個類的功能。
ConfigurationElement
ConfigurationElementCollection
ConfigurationSection
ConfigurationSectionGroup
我認為,如果要自定義強類型的配置內容,理解以下內容非常重要。
假設我現在的命題是要讀寫如下的配置文件
??? <DataBaseSchemaConfig>
??????? <Schemas>
??????????? <add SchemaName="TestDataBase" SchemaVersion="1.0" SchemaFlag="1_0" />
??????????? <add SchemaName="TestDataBase2" SchemaVersion="1.1" SchemaFlag="1_1">
??????????????? <Tables>
??????????????????? <add TableName="T_TEST_TABLE" TableDesc="測試表">
??????????????????????? <Columns>
??????????????????????????? <add ColumnName="ID" ColumnDesc="標識" ColumnType="System.Int32" />
??????????????????????????? <add ColumnName="Name" ColumnDesc="名稱" ColumnType="System.String" />
??????????????????????????? <add ColumnName="Desc" ColumnDesc="描述" ColumnType="System.String" />
??????????????????????? </Columns>
??????????????????? </add>
??????????????? </Tables>
??????????? </add>
??????? </Schemas>
??? </DataBaseSchemaConfig>
SectionGroup就是一組Session,這個很好理解。
Section是配置文件中一個節。每一個節都對應了系統中的一個強類型的Section對象,該Section對象將用來處理對應的Section。如果你用系統內置的一些Section對象,那么配置文件的內容就會受到很大的限制。從Configuration的架構來看,應當是派生自己的Section對象用來處理自己的需求。好,下面就上面的命題來看看實現
首先:
我們需要一個根節點,我定義為
?public sealed class DataBaseSchemaConfigSection : ConfigurationSection {
該節點作為整個配置節的入口。?
從配置文件可以看出,根節下面是一個Schemas元素。里面包含了很多Schema元素。可以看出這是一個集合。
所以很自然的,我們應當在DataBaseSchemaConfigSection中加入一個集合對象,這個集合對象用來管理Schema元素對應的對象,也就是我們需要一個 ConfigurationElementCollection
public sealed class DataBaseSchemaCollection : ConfigurationElementCollection
這個對象就可以用來管理下面的Schema對象
public sealed class DataBaseSchemaSection : ConfigurationSection
再往下,實際和前面的型式完全一樣,是一層一層嵌套下來的。
public sealed class DataBaseTableCollection : ConfigurationElementCollection
public sealed class DataBaseTableSection : ConfigurationSection
public sealed class DataBaseColumnCollection : ConfigurationElementCollection
public sealed class DataBaseColumnSection : ConfigurationSection
實際上整個的配置文件就是Section,ConfigurationElement的反復使用。
理解了整個架構之后,就可以非常輕松的寫出讀寫自己自定義的配置信息。
從對象到配置文件中的對應,是通過對象的自定義屬性實現的。如:
?
????????[ConfigurationProperty("ColumnName",IsKey=true,IsRequired=true)]????????public?string?ColumnName?{
????????????get?{?
????????????????return?(string)this["ColumnName"];
????????????}
????????????set?{
????????????????this["ColumnName"]?=?value;
????????????}
????????}
?
實際對象的屬性數據是保存在祖先類中的,你需要作的是強類型轉換成你自己類型。
另外,在自定義屬性中,最重要的是元素名稱,有可能是Section名稱,也可能是作為元素的屬性名稱。
差不多,理解到這里,基本的應用就應當沒有問題了。
再深入研究一下,基實自定義配置的序列化也是可以控制的。準備以后有需要的時候再進行研究。
轉載于:https://www.cnblogs.com/goldpicker/archive/2006/08/25/486675.html
總結
以上是生活随笔為你收集整理的关于.Net2.0下配置架构的使用的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 格力抖音带货直播间头像变成董明珠:学霸秘
- 下一篇: 煲仔