在ASPNET中配置數據存儲在nfig文件中該文件使用xml來表示數據所有的配置信息都位於和根xml標記之間這裡的配置信息分為兩個區域配置節處理程序聲明區域和配置節設置區域
配置節處理程序聲明區域位於和xml標記之間使用section元素來聲明配置節處理程序可以將這些配置節處理程序聲明嵌套在sectionGroup元素中幫助組織配置信息如下所示<configSections>
<sectionGroup name=systemweb type= SystemWebConfigurationSystemWebSectionGroupSystemWeb Version= Culture=neutralPublicKeyToken=bfffdaa> <section name=pages type= SystemWebConfigurationPagesSectionSystemWeb Version= Culture=neutralPublicKeyToken=bfffdaa /> <!—— Other <section /> elements ——> </sectionGroup> <!—— Other <sectionGroup /> and <section /> elements ——> </configSections>配置節處理程序聲明區域中的每個配置節都有一個節處理程序聲明節處理程序是實現了ConfigurationSection類的Net Framework類節處理程序聲明中包含節的名稱(如pages)以及用來處理該節中配置數據的節處理程序類的名稱(如SystemWebConfigurationPagesSection)如下所示<section name=pages type= SystemWebConfigurationPagesSectionSystemWeb Version= Culture=neutralPublicKeyToken=bfffdaa> </section>當您需要自定義配置節時需要完成這樣幾個任務一設計自己的配置節處理程序類實現ConfigurationSection類並擴展自己所需的功能二在配置節處理程序聲明區域中聲明節處理程序類三在配置節配置自定義的配置節
實現自己的配置節處理程序通常有兩種方式也就是兩種實現模型分別是聲明性模型和編程模型首先我們以聲明性模型來實現一個自定義配置節處理程序添加CustomSectioncs文件到網站其內容如下using Systemusing SystemConfigurationnamespace AntarDev { public class CustomSectionConfigurationSection { public CustomSection()
{ }
[ConfigurationProperty(CustomAttribute)] public String CustomAttribute { get { return (String)this[CustomAttribute]} set { this[CustomAttribute] = value}修改nfig文件在ConfigSections配置節添加自己的配置節如下所示<configSections> <sectionGroup name=newSectionGroup> <section name=newSection type=AntarDevCustomSection/> </sectionGroup> </configSections>在之後的配置節設置區域中使用我們新定義的配置節如下所示<newSectionGroup> <newSection CustomAttribute=AttributeValue /> </newSectionGroup>然後我們在Defaultaspx的Page_Load事件中書寫如下代碼以編程方式訪問配置數據protected void Page_Load(object sender EventArgs e)
{ AntarDevCustomSection cus =(AntarDevCustomSection)ConfigurationManager GetSection(newSectionGroup/newSection)ResponseWrite(Attribute= + cusCustomAttribute)}運行網站將會輸出Attribute=AttributeValue我們的自定義配置節已經可以正常工作雖然她是那麼的原始而且看起來並不能完成什麼具體的工作但是先讓我們耐心理解這個簡單的示例吧這樣我們才能進一步學些自定義配置節的高級用法來幫助我們完成有意義的工作^_^在CustomSection類的實現中有下面幾個細節需要解釋一下繼承自ConfigurationSection類這是本文中創建自定義配置節程序類的基礎雖然也可以通過繼承IConfigurationSectionHandler創建自定義配置節但是該接口在Net中已經被否決本文中將不討論基於該接口的實現方法
通過對類的一個普通字符串屬性(Property)CustomAttribute進行修飾使之成為了一個配置節的節屬性(Attribute)這是通過ConfigurationPropertyAttribute來實現的關於該屬性(Attribute)的詳細用法請查閱MSDN 在CustomAttribute屬性的get和set訪問器中我們使用了this[CustomAttribute ]來存取節屬性的值為什麼可以這樣使用呢?因為我們的類繼承自ConfigurationSection類而該類繼承自ConfigurationElement在ConfigurationElement類中定義了兩個索引器如下所示protected internal object this[ConfigurationProperty prop] { get set }
protected internal object this[string propertyName] { get set }我們自己的程序中的用法正是使用的該類中的第二個索引器對配置數據進行訪問通過聲明性模型創建自定義配置節程序類比較簡單因為他對ASPNET的基礎配置架構進行了進一步的封裝使我們更方便使用同時簡化了程序結構
[ConfigurationProperty(CustomAttribute)]屬性修飾與被修飾屬性的兩個訪問器中的this[CustomAttribute]其中的字符串必須一致因為這個字符串就代表著要操作的節屬性名稱也就是在nfig中要使用的節屬性名稱
通過上例中的CustomSection類我們實現了如下形式的自定義配置節<newSectionGroup> <newSection CustomAttribute=AttributeValue /> </newSectionGroup>現在newSection元素僅僅是一個元素如果我們希望newSection元素可以包含子元素呢?如下所示<newSectionGroup> <newSection CustomAttribute=AttributeValue> <SubElement ElementAttribute=newValue></SubElement> </newSection> </newSectionGroup>要能夠給newSection元素添加一個子元素需要對我們的自定義配置節程序類進行改進如下所示using Systemusing SystemConfigurationnamespace AntarDev { public class CustomSectionConfigurationSection { public CustomSection()
{ }
[ConfigurationProperty(CustomAttribute)] public String CustomAttribute { get { return (String)this[CustomAttribute]} set { this[CustomAttribute] = value}
[ConfigurationProperty(SubElement)] public CustomElement SubElement {//新添加的屬性因為其返回類型繼承自ConfigurationElement故可以在nfig中作為配置節的子元素使用
get { return (CustomElement)this[SubElement]} set { this[SubElement] = value } }
public class CustomElement ConfigurationElement {//新添加的自定義元素
[ConfigurationProperty(ElementAttribute)] public string ElementAttribute { get { return (String)this[ElementAttribute] } set { this[ElementAttribute] = value } }在上述程序中我們進行了如下改動
增加一個繼承自ConfigurationElement的類CustomElement作為自定義配置節的子元素同時為該類聲明一個新屬性作為子元素的元素屬性
在自定義配置節程序類中增加一個屬性該屬性使用ConfigurationPropertyAttribute修飾同時返回類型為CustomElement(繼承自ConfigurationElement)
編程訪問新增的子元素
protected void Page_Load(object sender EventArgs e)
{ AntarDevCustomSection cus = AntarDevCustomSection)ConfigurationManager GetSection(newSectionGroup/newSection)ResponseWrite(subElement= + cusSubElementElementAttribute)}如果希望配置節有兩個或者兩個以上子元素呢?類似於下面這樣<newSectionGroup> <newSection CustomAttribute=AttributeValue> <SubElement ElementAttribute=newValue /> </newSection> </newSectionGroup>直接編譯運行會出現錯誤提示SubElement只能出現一次因為該子元素在配置節處理程序中是作為一個屬性存在(Property)的如果希望出現多個子元素需要使用集合的方式來實現如下所示<newSectionGroup> <newSection CustomAttribute=AttributeValue> <ElementCollection> <add ElementAttribute=CollectionTest /> <add ElementAttribute=CollectionTest /> </ElementCollection> </newSection> </newSectionGroup>為此需要對我們的自定義配置節程序類進行改進如下所示using Systemusing SystemConfigurationnamespace AntarDev { public class CustomSectionConfigurationSection { public CustomSection()
{ }
[ConfigurationProperty(CustomAttribute)] public String CustomAttribute { get { return (String)this[CustomAttribute]} set { this[CustomAttribute] = value}
[ConfigurationProperty(SubElement)] public CustomElement SubElement { get { return (CustomElement)this[SubElement]} set { this[SubElement] = value } }
[ConfigurationProperty(ElementCollection)] public CustomElementCollection SubElementCollection {//添加了一個新屬性返回類型為一個繼承自ConfigurationElementCollection的類get { return (CustomElementCollection)this[ElementCollection]} }
public class CustomElement ConfigurationElement { [ConfigurationProperty(ElementAttribute)] public string ElementAttribute { get { return (String)this[ElementAttribute] } set { this[ElementAttribute] = value } }
public class CustomElementCollection ConfigurationElementCollection {//新創建的類下面兩個方法是繼承自ConfigurationElementCollection的類必須實現的兩個基本方法protected override ConfigurationElement CreateNewElement()
{ return new CustomElement()}
protected override object GetElementKey(ConfigurationElement element)
{ return ((CustomElement)element)ElementAttribute}考慮一下在appSettings配置節中常見的形式並不需要使用一個嵌套元素將子元素包圍起來直接就可以使用addremoveclear元素對配置元素進行修改在我們的自定義配置節處理程序中如何實現呢?先看一下原先的實現方法[ConfigurationProperty(ElementCollection)] public CustomElementCollection SubElementCollection {//添加了一個新屬性返回類型為一個繼承自ConfigurationElementCollection的類get{ return (CustomElementCollection)this[ElementCollection]} }我們使用ConfigurationPropertyAttribute修飾屬性將其轉換為一個內置的元素集合如果將ConfigurationPropertyAttribute中的字符串改為空同時增加IsDefaultCollection=true變成下面這樣[ConfigurationProperty(IsDefaultCollection=true)] public CustomElementCollection SubElementCollection {//添加了一個新屬性返回類型為一個繼承自ConfigurationElementCollection的類get{ return (CustomElementCollection)this[]}//這裡也為空字符串}這樣的話就可以像appSettings配置節那樣直接操作子元素了至於newSectionGroup元素如果不喜歡去掉就是了
<newSectionGroup> <newSection CustomAttribute=AttributeValue> <add ElementAttribute=directCollection /> <add ElementAttribute=directCollection /> </newSection> </newSectionGroup>至此關於自定義配置節處理程序中常見的幾種元素組織形式我們都已經可以實現細節部分在具體的項目中還需要具體完善同時NET Framework中有不少現成的配置節處理程序如果能夠實現需求不放直接使用比如NameValueSectionHandler等類
From:http://tw.wingwit.com/Article/program/net/201311/12557.html