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

推荐订阅源

博客园_首页
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
P
Proofpoint News Feed
G
Google Developers Blog
B
Blog
Engineering at Meta
Engineering at Meta
阮一峰的网络日志
阮一峰的网络日志
The Register - Security
The Register - Security
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
博客园 - 叶小钗
The Cloudflare Blog
The Hacker News
The Hacker News
D
Darknet – Hacking Tools, Hacker News & Cyber Security
C
CXSECURITY Database RSS Feed - CXSecurity.com
雷峰网
雷峰网
F
Fortinet All Blogs
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
H
Hackread – Cybersecurity News, Data Breaches, AI and More
酷 壳 – CoolShell
酷 壳 – CoolShell
Last Week in AI
Last Week in AI
T
Threat Research - Cisco Blogs
A
About on SuperTechFans
量子位
Recorded Future
Recorded Future
博客园 - 三生石上(FineUI控件)
H
Help Net Security
Help Net Security
Help Net Security
P
Palo Alto Networks Blog
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
T
Troy Hunt's Blog
W
WeLiveSecurity
V
Vulnerabilities – Threatpost
T
The Exploit Database - CXSecurity.com
Know Your Adversary
Know Your Adversary
Apple Machine Learning Research
Apple Machine Learning Research
Scott Helme
Scott Helme
N
News | PayPal Newsroom
AWS News Blog
AWS News Blog
D
DataBreaches.Net
Blog — PlanetScale
Blog — PlanetScale
MongoDB | Blog
MongoDB | Blog
B
Blog RSS Feed
腾讯CDC
J
Java Code Geeks
Microsoft Azure Blog
Microsoft Azure Blog
TaoSecurity Blog
TaoSecurity Blog
GbyAI
GbyAI
Y
Y Combinator Blog
Hacker News - Newest:
Hacker News - Newest: "LLM"
D
Docker

博客园 - 疾风

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平台》一书