zoukankan      html  css  js  c++  java
  • 自定义配置节 Section


    项目中遇到需求:随时通过增删改配置文件中配置节,来修改程序获取的配置,这里应用到自定义配置节section  type="System.Configuration.NameValueSectionHandler"。 进而详细学习了一下自定义配置节

    1.        配置文件概述:

    应用程序配置文件是标准的 XML 文件,XML 标记和属性是区分大小写的。它是可以按需要更改的,开发人员可以使用配置文件来更改设置,而不必重编译应用程序。配置文件的根节点是configuration。我们经常访问的是appSettings,它是由.Net预定义配置节。我们经常使用的配置文件的架构是象下面的形式。先大概有个印象,通过后面的实例会有一个比较清楚的认识。下面的“配置节”可以理解为进行配置一个XML的节点。

     常见配置文件模式:

     常见配置文件模式:

    <configuration>
            <configSections>    //
    配置节声明区域,包含配置节和命名空间声明
                    <section>              //配置节声明
         
            <sectionGroup>       //定义配置节组
            
              <section>       //配置节组中的配置节声明
            <appSettings> //
    预定义配置节
            <Custom element for configuration section>  //
    配置节设置区域

     2.        只有appSettings节的配置文件及访问方法

    下面是一个最常见的应用程序配置文件的例子,只有appSettings节。

    <?xml version="1.0" encoding="utf-8"?>

    <configuration>
        
    <appSettings>
            
    <add key="connectionstring" value="User ID=sa;Data Source=.;Password=;Initial Catalog=test;Provider=SQLOLEDB.1;" />
            
    <add key="TemplatePATH" value="Template" />
        
    </appSettings>
    </configuration>

    下面来看看这样的配置文件如何方法。

    string _connectionString=ConfigurationSettings.AppSettings["connectionstring"];

    使用ConfigurationSettings类的静态属性AppSettings就可以直接方法配置文件中的配置信息。这个属性的类型是NameValueCollection

     3.        自定义配置文件

    3.1 自定义配置节

    一个用户自定义的配置节,在配置文件中分为两部分:一是在<configSections></ configSections>配置节中声明配置节(上面配置文件模式中的“<section>”),另外是在<configSections></ configSections >之后设置配置节(上面配置文件模式中的“<Custom element for configuration section>”),有点类似一个变量先声明,后使用一样。声明一个配置文件的语句如下:

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

    <section>:声明新配置节,即可创建新配置节。

    name:自定义配置节的名称。

    type:自定义配置节的类型,主要包括System.Configuration.SingleTagSectionHandler、System.Configuration.DictionarySectionHandler、System.Configuration.NameValueSectionHandler。

    不同的type不但设置配置节的方式不一样,最后访问配置文件的操作上也有差异。下面我们就举一个配置文件的例子,让它包含这三个不同的type

    <?xml version="1.0" encoding="utf-8" ?>
    <configuration>
        
    <configSections>
            
    <section name="Test1" type="System.Configuration.SingleTagSectionHandler"/>
            
    <section name="Test2" type="System.Configuration.DictionarySectionHandler"/>
            
    <section name="Test3" type="System.Configuration.NameValueSectionHandler" />
        
    </configSections>
        
        
    <Test1 setting1="Hello" setting2="World"/>
        
    <Test2>
            
    <add key="Hello" value="World" />
        
    </Test2>
        
    <Test3>
             
    <add key="Hello1" value="World" />
               <add key="Hello2" value="World" />
               <add key="Hello3" value="World" />
        
    </Test3>    
    </configuration>


    我们对上面的自定义配置节进行说明。在声明部分使用<section name="Test1"type="System.Configuration.SingleTagSectionHandler"/>声明了一个配置节它的名字叫Test1,类型为SingleTagSectionHandler。在设置配置节部分使用     <Test1 setting1="Hello"setting2="World"/>设置了一个配置节,它的第一个设置的值是Hello,第二个值是World,当然还可以有更多。其它的两个配置节和这个类似。

    下面我们看在程序中如何访问这些自定义的配置节。我们用过ConfigurationSettings类的静态方法GetConfig来获取自定义配置节的信息。

    public static object GetConfig(stringsectionName);
    
    

    下面是访问这三个配置节的代码:

    
    

    下面是访问这三个配置节的代码:

                //访问配置节Test1
                IDictionary IDTest1 = (IDictionary)ConfigurationSettings.GetConfig("Test1");
                
    string str = (string)IDTest1["setting1"+" "+(string)IDTest1["setting2"];
                MessageBox.Show(str);        
    //输出Hello World

                
    //访问配置节Test1的方法2
                string[] values1=new string[IDTest1.Count];
                IDTest1.Values.CopyTo(values1,
    0);
                MessageBox.Show(values1[
    0]+" "+values1[1]);    //输出Hello World
                
                
    //访问配置节Test2
                IDictionary IDTest2 = (IDictionary)ConfigurationSettings.GetConfig("Test2");
                
    string[] keys=new string[IDTest2.Keys.Count];
                
    string[] values=new string[IDTest2.Keys.Count];
                IDTest2.Keys.CopyTo(keys,
    0);
                IDTest2.Values.CopyTo(values,
    0);
                MessageBox.Show(keys[
    0]+" "+values[0]);
                
                
    //访问配置节Test3
                NameValueCollection nc=(NameValueCollection)ConfigurationSettings.GetConfig("Test3");
                MessageBox.Show(nc.AllKeys[
    0].ToString()+" "+nc["Hello"]);    //输出Hello World


    通过上面的代码我们可以看出,不同的type通过GetConfig返回的类型不同,具体获得配置内容的方式也不一样。

    配置节处理程序

    返回类型

    SingleTagSectionHandler

    Systems.Collections.IDictionary

    DictionarySectionHandler

    Systems.Collections.IDictionary

    NameValueSectionHandler

    Systems.Collections.Specialized.NameValueCollection


      3.2 自定义配置节组

    配置节组是使用<sectionGroup>元素,将类似的配置节分到同一个组中。配置节组声明部分将创建配置节的包含元素,在<configSections>元素中声明配置节组,并将属于该组的节置于<sectionGroup>元素中。下面是一个包含配置节组的配置文件的例子:
    <?xml version="1.0" encoding="utf-8" ?>

    <configuration>
        
    <configSections>
            
    <sectionGroup name="TestGroup">
                
    <section name="Test" type="System.Configuration.NameValueSectionHandler"/>
            
    </sectionGroup>
        
    </configSections>
        
        
    <TestGroup>
            
    <Test>
                
    <add key="Hello" value="World"/>
            
    </Test>
        
    </TestGroup>
    </configuration>

    下面是访问这个配置节组的代码:
    NameValueCollection myvalue=(NameValueCollection)ConfigurationSettings.GetConfig("TestGroup/Test");
    MessageBox.Show(myvalue.AllKeys[0].ToString()+""+myvalue["Hello"]); //
    输出HelloWorld

    4.自定义配置节处理函数

    我们可以重用。net自带的配置节应用程序,也可以定义自己的配置节应用程序。

    自定义配置节处理程序必须实现IconfigurationSectionHandler接口,这个接口只有一个名为Create的方法,该方法接受三个参数:一个名为parentobject变量,一个HttpConfigurationContext对象变量,一个名为sectionXmlNode变量。

    <!--web.config-->
    <configuration>
        <configSections>
            <section name="mySection"
                     type="Custom.CustomTagHandlerCustom" />
        </configSections>
        <mySection>
            <AppName> MyApplication</AppName>
        </mySection>
    ... ...

    以上声明了一个mySection元素,并在configSections中声明了该配置的处理程序类名为Custom.CustomTagHandlerCustom为程序集名称。接下来我们可以通过一个实现System.Configuration.IConfigurationSectionHandler接口的类来处理该配置元素,如:

    <!--CustomTagHandler.cs-->
    using Custom.Data;
    namespace Custom
    {
      public class CustomTagHandler:IConfigurationSectionHandler
     {  //实现该接口的Create方法
      public object Create(object parent, object input, XmlNode node)
      {
       Data data = new Data();

       foreach(XmlNode xn in node.ChildNodes)
       {
        switch(xn.Name)
        {
         case("appName"):
          data.AppName = xn.InnerText;
          break;
         case("appVer"):
          data.AppVer = xn.InnerText;
          break;
          ... ...
        }//switch end
        
       }//foreach end

       return data;

      }//method end
     }
    }

    IConfigurationSectionHandler 接口只有一种方法,每当发现注册到处理程序的配置节时,都会在节处理程序上调用 Create 方法,我们实现的类返回一个Data类的实例,该类是一个专门的数据集,代码如下:

    <!--Data.cs-->
    namespace Custom.Data
    {
     public class Data
     {
      public Data()
      {
      }
      public string AppName;//程序名称
      public string AppVer;//程序版本
      public string AppAuthor;//程序作者
      ...  ...
     }
    }

    至此,现在可以读取配置元素值了,如:

    <!--Sample1.aspx-->
    private void Page_Load(object sender, System.EventArgs e)
    {
       Data data;
       data = ConfigurationSettings.GetConfig("mySection") as Data;
       this.tbName.Text = data.AppName;   
    }

  • 相关阅读:
    Codeforces 787D. Legacy 线段树优化建图+最短路
    Codeforces 1051E. Vasya and Big Integers
    BZOJ3261 最大异或和
    BZOJ3531 SDOI2014 旅行
    洛谷P2468 SDOI 2010 粟粟的书架
    2018 ICPC 焦作网络赛 E.Jiu Yuan Wants to Eat
    HDU6280 From Tree to Graph
    HDU5985 Lucky Coins 概率dp
    (HDU)1334 -- Perfect Cubes (完美立方)
    (HDU)1330 -- Deck (覆盖物)
  • 原文地址:https://www.cnblogs.com/xiaofeilong/p/3419619.html
Copyright © 2011-2022 走看看