[UpDate@]2004.10.31
(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="licunqing@gmail.com"/>
</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)
[增加修改中......]
===========
参考:
全部信息请search MSDN:ASP.NET 配置系统 / 配置文件架构
另外看看Duwamish的源代码
http://www.microsoft.com/china/community/program/originalarticles/TechDoc/duwamish_con.mspx
原文转自http://www.cnblogs.com/caca/archive/2004/09/23/46091.aspx