• 在.net中使用强类型来读取配置信息


     本文来自  疾风萧萧  http://achilleshuang.cnblogs.com/archive/2005/11/27/dotNetConfiguration.html

    在.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平台》一书
  • 相关阅读:
    在路上。。。
    DNN模块打包(DNN-ModulePack简称为DNNMP)
    创建一个PortalSettings,这也行。
    对Web 2.0 的体验
    太空旅客 第七位 了
    计划今年每月至少写一篇技术性文章
    检索 COM 类工厂中 CLSID 为 {0002450000000000C000000000000046} 的组件时失败,原因是出现 以下错误: 80070005
    RadGrid RaisePostBackEvent 刷新页面问题。
    做为团队中的一员
    dnn captcha 图片 显示不了 见鬼了
  • 原文地址:https://www.cnblogs.com/ghd258/p/285580.html
Copyright © 2020-2023  润新知