繼續學習WEB.CONFIG

(1)各個標記名的命名規則:
標記名和屬性名是 Camel 大小寫形式的,這意味着標記名的第一個字符是小寫的,任何後面連接單詞的第一個字母是大寫的。屬性值是 Pascal 大小寫形式的,這意味着第一個字符是大寫的,任何後面連接單詞的第一個字母也是大寫的。true 和 false 例外,它們總是小寫的。

(2)配置層次總圖

所有配置信息都駐留在 <configuration> 和 </configuration> 根 XML 標記之間。
標記間的配置信息分爲兩個主區域:配置節處理程序聲明區域和配置節設置區域。

<?xml version="1.0"?> <!-- 可以不要 -->
<configuration>
<!-- ============= 1 =============================== !-->
<!-- 配置節處理程序聲明區域(必須放在本節點的最上) -->
 
<configSections>
<section name="appSettings" type="System.Configuration.NameValueFileSectionHandler, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"/>
<!-- 這個section沒有放到任何命名空間分組裏面  -->
  
<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"];

所以,我們可以建立自己的type,至於相應的配置節設置區域的格式,我們這裏還用System.Configuration.NameValueFileSectionHandler的形式.
來看看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 class DuwamishConfiguration : IConfigurationSectionHandler
{
 
//這裏簡化了原代碼
 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)

 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章