在.net应用中,配置信息以XML文档的形式来存储。依.net的惯例,web.config为Asp.net应用(包括Web Service应用)提供配置信息;而*.exe.config为可执行的应用(包括控制台、Windows服务、Windows桌面应用程序)提供配置信息,其中的“*”代表易用的程序集名称,例如App.exe程序集的对应配置文件为App.exe.config。
1、使用默认方法读取
在代码中使用System.Configuration名称空间中的ConfigurationManager即可方便地对配置进行读取(1.1版使用ConfigurationSettings),比如,用如下代码就可以读取一条配置信息:
![](https://achilleshuang.cnblogs.com/Images/OutliningIndicators/None.gif)
这段代码读取配置文件AppSetting段中的如下信息:
![](https://achilleshuang.cnblogs.com/Images/OutliningIndicators/None.gif)
![](https://achilleshuang.cnblogs.com/Images/OutliningIndicators/None.gif)
![](https://achilleshuang.cnblogs.com/Images/OutliningIndicators/None.gif)
确实够简单,但是如果我的配置信息更为复杂呢,比如说分为如下的层次:
![](https://achilleshuang.cnblogs.com/Images/OutliningIndicators/None.gif)
![](https://achilleshuang.cnblogs.com/Images/OutliningIndicators/None.gif)
![](https://achilleshuang.cnblogs.com/Images/OutliningIndicators/None.gif)
![](https://achilleshuang.cnblogs.com/Images/OutliningIndicators/None.gif)
![](https://achilleshuang.cnblogs.com/Images/OutliningIndicators/None.gif)
![](https://achilleshuang.cnblogs.com/Images/OutliningIndicators/None.gif)
![](https://achilleshuang.cnblogs.com/Images/OutliningIndicators/None.gif)
![](https://achilleshuang.cnblogs.com/Images/OutliningIndicators/None.gif)
![](https://achilleshuang.cnblogs.com/Images/OutliningIndicators/None.gif)
![](https://achilleshuang.cnblogs.com/Images/OutliningIndicators/None.gif)
2、使用强类型来读取
在.net中,配置文件中的所有信息都经由IconfigurationSectionHandler接口读出。该接口只有一个方法:
![](https://achilleshuang.cnblogs.com/Images/OutliningIndicators/None.gif)
通过这个方法,IconfigurationSectionHandler接口读取信息并把它们转换成程序易于使用的形式。
首先让我们来看一个简单的配置文件:
![](https://achilleshuang.cnblogs.com/Images/OutliningIndicators/None.gif)
![](https://achilleshuang.cnblogs.com/Images/OutliningIndicators/None.gif)
![](https://achilleshuang.cnblogs.com/Images/OutliningIndicators/None.gif)
![](https://achilleshuang.cnblogs.com/Images/OutliningIndicators/None.gif)
![](https://achilleshuang.cnblogs.com/Images/OutliningIndicators/None.gif)
![](https://achilleshuang.cnblogs.com/Images/OutliningIndicators/None.gif)
![](https://achilleshuang.cnblogs.com/Images/OutliningIndicators/None.gif)
![](https://achilleshuang.cnblogs.com/Images/OutliningIndicators/None.gif)
![](https://achilleshuang.cnblogs.com/Images/OutliningIndicators/None.gif)
![](https://achilleshuang.cnblogs.com/Images/OutliningIndicators/None.gif)
![](https://achilleshuang.cnblogs.com/Images/OutliningIndicators/None.gif)
![](https://achilleshuang.cnblogs.com/Images/OutliningIndicators/None.gif)
![](https://achilleshuang.cnblogs.com/Images/OutliningIndicators/None.gif)
![](https://achilleshuang.cnblogs.com/Images/OutliningIndicators/None.gif)
![](https://achilleshuang.cnblogs.com/Images/OutliningIndicators/None.gif)
![](https://achilleshuang.cnblogs.com/Images/OutliningIndicators/None.gif)
![](https://achilleshuang.cnblogs.com/Images/OutliningIndicators/None.gif)
![](https://achilleshuang.cnblogs.com/Images/OutliningIndicators/None.gif)
![](https://achilleshuang.cnblogs.com/Images/OutliningIndicators/None.gif)
![](https://achilleshuang.cnblogs.com/Images/OutliningIndicators/None.gif)
如上面所示,除根节点(<configuration>)外,配置数据分为两部分:段处理器(section handler,指节点<configSections>中的所有内容)部分和段内容(section,除<configSections>节点外的内容)部分。
段处理器部分为给段的内容制定相应的数据处理类,即在<section>节点中,type属性描述的类(前面为包括名称空间的类名,后面为程序集名,使用逗号分隔)被指定用于处理name属性描述的段内容。
那么,段处理器如何处理相应段的内容呢?原来,<configSections>定义的每一个处理器类都必须实现IconfigurationSectionHandler接口,当执行下列代码时,CLR将通过两个步骤获得一个处理器:
![](https://achilleshuang.cnblogs.com/Images/OutliningIndicators/None.gif)
首先,CLR在配置文件的段处理器部分找到与“DbServer”相应的段处理器描述,并通过反射机制创建一个处理器对象;然后调用处理器对象的Create方法并传入3个参数,其中第3个参数包含了该段内容的XML信息(在我们的例子中就是DbServer节点下的所有内容),然后返回Create的返回值。
那我们这就是建立一个简单的段处理器类吧
![](https://achilleshuang.cnblogs.com/Images/OutliningIndicators/None.gif)
![](https://achilleshuang.cnblogs.com/Images/OutliningIndicators/None.gif)
![](https://achilleshuang.cnblogs.com/Images/OutliningIndicators/None.gif)
![](https://achilleshuang.cnblogs.com/Images/OutliningIndicators/None.gif)
![](https://achilleshuang.cnblogs.com/Images/OutliningIndicators/None.gif)
![](https://achilleshuang.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](https://achilleshuang.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](https://achilleshuang.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](https://achilleshuang.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](https://achilleshuang.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](https://achilleshuang.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](https://achilleshuang.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](https://achilleshuang.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
![](https://achilleshuang.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](https://achilleshuang.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](https://achilleshuang.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](https://achilleshuang.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](https://achilleshuang.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](https://achilleshuang.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
![](https://achilleshuang.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](https://achilleshuang.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](https://achilleshuang.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](https://achilleshuang.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](https://achilleshuang.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](https://achilleshuang.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](https://achilleshuang.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](https://achilleshuang.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](https://achilleshuang.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](https://achilleshuang.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
![](https://achilleshuang.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
![](https://achilleshuang.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](https://achilleshuang.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
![](https://achilleshuang.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
![](https://achilleshuang.cnblogs.com/Images/OutliningIndicators/ExpandedBlockEnd.gif)
![](https://achilleshuang.cnblogs.com/Images/OutliningIndicators/None.gif)
接着,把段处理器部分的
![](https://achilleshuang.cnblogs.com/Images/OutliningIndicators/None.gif)
改为
![](https://achilleshuang.cnblogs.com/Images/OutliningIndicators/None.gif)
就可以使用下面的语句来读取配置文件中的内容了:
![](https://achilleshuang.cnblogs.com/Images/OutliningIndicators/None.gif)
![](https://achilleshuang.cnblogs.com/Images/OutliningIndicators/None.gif)
![](https://achilleshuang.cnblogs.com/Images/OutliningIndicators/None.gif)
![](https://achilleshuang.cnblogs.com/Images/OutliningIndicators/None.gif)
这是示例程序。
本文主要参考了《应用框架的设计与实现--.net平台》一书