(1)各個標記名的命名規則:
標記名和屬性名是 Camel 大小寫形式的,這意味着標記名的第一個字符是小寫的,任何後面連接單詞的第一個字母是大寫的。屬性值是 Pascal 大小寫形式的,這意味着第一個字符是大寫的,任何後面連接單詞的第一個字母也是大寫的。true 和 false 例外,它們總是小寫的。
(2)配置層次總圖
所有配置信息都駐留在 <configuration> 和 </configuration> 根 XML 標記之間。
標記間的配置信息分爲兩個主區域:配置節處理程序聲明區域和配置節設置區域。
<configuration>
<!-- ============= 1 =============================== !-->
<!-- 配置節處理程序聲明區域(必須放在本節點的最上) -->
<configSections>
<sectionGroup name="system.web"> <!-- 按照命名空間分組 -->
<section name="authorization"
type="System.Web.Configuration.AuthorizationConfigHandler,
System.Web, Version=1.0.3300.0, Culture=neutral,
PublicKeyToken=b03f5f7f11d50a3a"/>
<section name="sessionState"
type="System.Web.SessionState.SessionStateSectionHandler,
System.Web, Version=1.0.3300.0, Culture=neutral,
PublicKeyToken=b03f5f7f11d50a3a"
allowDefinition="MachineToApplication"/>
</sectionGroup>
</configSections>
<!-- ========= /1 ======================== -->
<!-- ========= 2 ======================== -->
<!-- 配置節設置區域 -->
<!-- 如果沒有上面的配置節處理程序聲明區域,但默認繼承了mechine.config,所以,我們在配置<authorization>等節點的
的時候,還是要加上它的組名稱<system.web>
-->
<system.web>
<authorization>
<allow users="*"/> <!-- Allow all users -->
<!-- Allow or deny specific users.
allow users="[comma separated list of users]"
roles="[comma separated list of roles]"/>
<deny users="[comma separated list of users]"
roles="[comma separated list of roles]"/>
-->
</authorization>
<sessionState
sqlConnectionString="data source=localhost;
Integrated Security=SSPI;
Initial Catalog=northwind"
cookieless="false"
timeout="10"/>
</system.web>
<!-- mechine.config沒有分組的節點名稱有:
runtime
mscorlib
startup
system.runtime.remoting
system.diagnostics
appSettings
所以他們在配置的時候就少了一個層次.
-->
<!-- ================ /2 ========================= -->
</configruation>
(3)配置原理
Example:
在配置節處理程序聲明
<section name="appSettings" type="System.Configuration.NameValueFileSectionHandler, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"/>
這個Section的name屬性表示我們要在下面的配置節設置區域對應的名稱.
type屬性由指定的類來處理讀取配置節設置區域的字段,其實這個type也定義了我們在配置節設置區域的配置格式.我們姑且把這種格式成爲 名稱/值對.
就這個type而言,上面例子的配置設置格式是:
<appSettings>
<add key="name" value="caca"/>
<add key="email" value="[email protected]"/>
</appSettings>
我們可以這樣讀取key的value
string myname=System.Configuration.ConfigurationSettings.AppSettings["name"];
也可以讀取所有的key的value返回一個集合
NameValueCollection config=(NameValueCollection)System.Configuration.ConfigurationSettings.GetConfig["appSettings"];
string myname=config["name"];
string myemail=config["email"];
來看看duwamish中的的例子
其配置節聲明區域有一個自定義的Type類型:
<section name="DuwamishConfiguration" type="Duwamish7.Common.DuwamishConfiguration, Duwamish7.Common" />
其相應的配置節聲明格式爲:
<DuwamishConfiguration>
<!-- Settings specific to the Duwamish application -->
<add key="Duwamish.Web.EnablePageCache" value="True"/>
......
<DuwamishConfiguration>
顯然這種配置節設置格式就是上面提到的 名稱/值對的格式.
看來這個Section其本質的type類型還是System.Configuration.NameValueFileSectionHandler.
看看Duwamish7.Common.DuwamishConfiguration
{
//這裏簡化了原代碼
public Object Create(Object parent, object configContext, XmlNode section)
{
NameValueCollection settings;
NameValueSectionHandler baseHandler = new NameValueSectionHandler();
settings = (NameValueCollection)baseHandler.Create(parent, configContext, section);
return settings;
}
}
確實,其本質就是NameValueSectionHandler,Duwamish7.Common.DuwamishConfiguration調用它,返回調用它的結果而已.
但是,我們這裏可以加一些自己的東西,從而很好的控制它,比如在Duwamish中,實現如果節點配置域沒有設置那些key 以及對應的value,就讓他返回一個默認值。(參見Duwamish7.Common.DuwamishConfiguration)