惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

WordPress大学
WordPress大学
The Cloudflare Blog
大猫的无限游戏
大猫的无限游戏
小众软件
小众软件
V
Visual Studio Blog
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
博客园 - 司徒正美
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
酷 壳 – CoolShell
酷 壳 – CoolShell
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
月光博客
月光博客
The GitHub Blog
The GitHub Blog
L
LangChain Blog
D
DataBreaches.Net
T
The Blog of Author Tim Ferriss
F
Fortinet All Blogs
博客园 - Franky
阮一峰的网络日志
阮一峰的网络日志
GbyAI
GbyAI
Apple Machine Learning Research
Apple Machine Learning Research
宝玉的分享
宝玉的分享
Engineering at Meta
Engineering at Meta
V
V2EX
MyScale Blog
MyScale Blog

博客园 - 疾风

Internet Explorer允许的URL最大长度为2083个字符(Maximum URL length is 2,083 characters in Internet Explorer) Eval和Bind 古筝和古琴有什么区别? 认识CSS中absolute与relative BAT详细手册 iframe的使用 领域逻辑的实现分类 面向对象问答 用户点击Log In按钮后发生了什么?(续篇1) 用户点击Log In按钮后发生了什么? 微软的在线RSS阅读器 2003年至2006年项目总结 经常会有一些Gmail的邀请函 Visual Studio 2005 RTM的奇怪问题 在.Net代码中验证XML文档 2006年的一些目标 创建强类型的程序集 自己做了一个单元测试的小工具---EasyTest.net How to gets the path for the executable file?
在.net中使用强类型来读取配置信息
疾风 · 2005-11-27 · via 博客园 - 疾风

    在.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),比如,用如下代码就可以读取一条配置信息:

string portNumber = ConfigurationManager.AppSettings["PortNumber"];

    这段代码读取配置文件AppSetting段中的如下信息:

<appSettings>
    
<add key="PortNumber" value="4532"/>
</appSettings>

    确实够简单,但是如果我的配置信息更为复杂呢,比如说分为如下的层次:

<Servers>
    
<DbServer>
        
<Address>10.1.1.1</Address>
        
<PortNumber>9797</PortNumber>
    
</DbServer>
    
<AppServer>
        
<Address>10.1.1.2</Address>
        
<PortNumber>5203</PortNumber>
    
</AppServer>
</Servers>

    那边某君回答:“这照样可以一字排开啊”--那么层次更加复杂的呢?嘿嘿,没招了吧。当然有招,我们可以建立强类型的读取类来处理,任你多么复杂也不在话下,哼哼。

2、使用强类型来读取
    
    在.net中,配置文件中的所有信息都经由IconfigurationSectionHandler接口读出。该接口只有一个方法:

object Create (object parent, object configContext, XmlNode section)

    

    通过这个方法,IconfigurationSectionHandler接口读取信息并把它们转换成程序易于使用的形式。
    首先让我们来看一个简单的配置文件:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    
<configSections>
        
<section name="DbServer" type=""/>
        
<section name="AppServer" type=""/>
    
</configSections>
<!--上面是段处理器部分-->
<!--下面是段内容部分-->
    
<appSettings>
        
<add key="PortNumber" value="4532"/>
    
</appSettings>
    
<DbServer>
          
<Address>10.1.1.1</Address>
          
<PortNumber>9797</PortNumber>
    
</DbServer>
    
<AppServer>
          
<Addr>10.1.1.2</Addr>
          
<Port>5203</Port>
    
</AppServer>
</configuration>

    如上面所示,除根节点(<configuration>)外,配置数据分为两部分:段处理器(section handler,指节点<configSections>中的所有内容)部分和段内容(section,除<configSections>节点外的内容)部分。
    段处理器部分为给段的内容制定相应的数据处理类,即在<section>节点中,type属性描述的类(前面为包括名称空间的类名,后面为程序集名,使用逗号分隔)被指定用于处理name属性描述的段内容。
    那么,段处理器如何处理相应段的内容呢?原来,<configSections>定义的每一个处理器类都必须实现IconfigurationSectionHandler接口,当执行下列代码时,CLR将通过两个步骤获得一个处理器:

object DbServerConfig = ConfigurationManager.GetSection("DbServer");

    首先,CLR在配置文件的段处理器部分找到与“DbServer”相应的段处理器描述,并通过反射机制创建一个处理器对象;然后调用处理器对象的Create方法并传入3个参数,其中第3个参数包含了该段内容的XML信息(在我们的例子中就是DbServer节点下的所有内容),然后返回Create的返回值。
    那我们这就是建立一个简单的段处理器类吧

using System;
using System.Configuration;
using System.Xml;

namespace SimpleConfig
{
    
public class DbServerConfig : IConfigurationSectionHandler
    
{
        
private string address;
        
public string Address
        
{
            
get return address; }
        }


        
private int portNumber;
        
public int PortNumber
        
{
            
get return portNumber; }
        }


        
public object Create(object parent, object configContext, XmlNode section)
        
{
            
foreach (XmlNode node in section.ChildNodes)
            
{
                
switch (node.Name)
                
{
                    
case "Address": address = node.InnerText; break;
                    
case "PortNumber": portNumber = Convert.ToInt32(node.InnerText); break;
                }

            }

            
return this;
        }

    }

}

    接着,把段处理器部分的

<section name="DbServer" type=""/>

    

    改为

<section name="DbServer" type="SimpleConfig.DbServerConfig, SimpleConfig"/>

    就可以使用下面的语句来读取配置文件中的内容了:

object o = ConfigurationManager.GetSection("DbServer");
DbServerConfig dbServerConfig 
= (DbServerConfig)o;
textBox1.Text 
= dbServerConfig.Address;
textBox2.Text 
= dbServerConfig.PortNumber.ToString();

    这是示例程序

    本文主要参考了《应用框架的设计与实现--.net平台》一书