.NET中ConfigurationManager.GetSection、ConfigurationSection、ConfigurationElement、ConfigurationElementCollection的用法

有时候我们需要将一些配置对象保存到Web/App config 中,使用ConfigurationManager.GetSection()方法可以方便的从配置文件中读取信息并映射(map)成我们写好的配置对象。

<configSections>
<section name="MailServerGroup" type="ConsoleApplication11.MailServerSection,ConsoleApplication11"/>
 </configSections>

<MailServerGroup provider="www.edong.com">
    <serverGroup >
      <mailServer
        client="blog.tracefact.net"
        address="mail2.tracefact.net"
        userName ="jimmyzhang"
        password="123456"
      />
      <mailServer
          client="forum.tracefact.net"
          address="mail1.tracefact.net"
          userName ="webmaster"
          password="456789"
      />
    </serverGroup>
  </MailServerGroup>

将配置信息映射到实体类上有两种方式,一种是继承ConfigurationSection(.NET推荐方式),另一种是实现IConfigurationSectionHandler。这里先看继承ConfigurationSection的方式如何实现。

public class MailServerSection : ConfigurationSection
    {
        [ConfigurationProperty("provider")]
        public string Provider
        {
            get
            {
                return this["provider"] as string;
            }
        }

        [ConfigurationProperty("serverGroup")]
        public ServerGroup ServerGroup
        {
            get
            {
                return (ServerGroup)this["serverGroup"];
            }
        }
    }

这里,将配置文件中的MailServerGroup节点与MailServerSection做映射,MailServerGroup节点中的属性provider与MailServerSection类中的属性做map。MailServerGroup节点中的serverGroup与MailServerSection类中的ServerGroup做map。这里的ServerGroup是一个继承自ConfigurationElementCollection的类。

 1 public class ServerGroup : ConfigurationElementCollection
 2     {
 3         protected override ConfigurationElement CreateNewElement()
 4         {
 5             return new MailServer();
 6         }
 7
 8         protected override object GetElementKey(ConfigurationElement element)
 9         {
10             return ((MailServer)element).Client;
11         }
12
13         public override ConfigurationElementCollectionType CollectionType
14         {
15             get
16             {
17                 return ConfigurationElementCollectionType.BasicMap;
18             }
19         }
20
21         protected override string ElementName
22         {
23             get
24             {
25                 return "mailServer";
26             }
27         }
28     }

而真正储存数据的是MailServer类,该类继承自ConfigurationElement

public class MailServer : ConfigurationElement
    {
        [ConfigurationProperty("client",IsKey=true)]
        public string Client
        {
            get
            {
                return this["client"] as string;
            }
        }

        [ConfigurationProperty("address")]
        public string Address
        {
            get
            {
                return this["address"] as string;
            }
        }

        [ConfigurationProperty("userName")]
        public string UserName
        {
            get
            {
                return this["userName"] as string;
            }
        }

        [ConfigurationProperty("password")]
        public string PassWord
        {
            get
            {
                return this["password"] as string;
            }
        }
    }

做好map 后,可以编写测试代码显示结果:

static void Main(string[] args)
        { 

            MailServerSection mailServerSection = (MailServerSection)ConfigurationManager.GetSection("MailServerGroup");
            Console.WriteLine(mailServerSection.Provider);
            Console.WriteLine(new string(‘-‘,20));
            foreach (MailServer _mailServer in mailServerSection.ServerGroup)
            {
                Console.WriteLine(string.Format("{0}{1}{2}{3}",
                                            _mailServer.Client.PadRight(15, ‘ ‘) + Environment.NewLine,
                                            _mailServer.Address.PadRight(15, ‘ ‘) + Environment.NewLine,
                                            _mailServer.UserName.PadRight(15, ‘ ‘) + Environment.NewLine,
                                            _mailServer.PassWord.PadRight(15, ‘ ‘)));
                Console.WriteLine(new string(‘-‘, 20));
            }
            PressQToExist();
        }

运行结果:

现在我们在来看一下采用实现IConfigurationSectionHandler的方式获取配置信息。实现该接口需要实现Create方法。

这里我们通过轮循传入XmlNode的方式逐级获取MailServerGroup的各个节点及其属性值。传入参数section就是我们的配置节点。

 1 public class MailServerGroupHandler : IConfigurationSectionHandler
 2     {
 3         public object Create(object parent, object configContext, XmlNode section)
 4         {
 5             MailServerGroup mailServerGroup = new MailServerGroup();
 6             mailServerGroup.Provider = section.Attributes["provider"].Value;
 7             foreach (XmlNode _serverGroup in section.ChildNodes)
 8             {
 9                 ServerGroup serverGroup = new ServerGroup();
10                 foreach (XmlNode _mailServer in _serverGroup.ChildNodes)
11                 {
12                     MailServer mailServer = new MailServer();
13                     mailServer.Client = _mailServer.Attributes["client"].Value;
14                     mailServer.Address = _mailServer.Attributes["address"].Value;
15                     mailServer.UserName = _mailServer.Attributes["userName"].Value;
16                     mailServer.PassWord = _mailServer.Attributes["password"].Value;
17                     serverGroup.MailServer.Add(mailServer);
18                 }
19                 mailServerGroup.ServerGroup.Add(serverGroup);
20             }
21             return mailServerGroup;
22         }
23     }

下面的各个类分别与配置文件中的各个节点进行映射map:

 1 public class MailServer
 2     {
 3         public string Client
 4         {
 5             get;
 6             set;
 7         }
 8
 9         public string Address
10         {
11             get;
12             set;
13         }
14
15         public string UserName
16         {
17             get;
18             set;
19         }
20
21         public string PassWord
22         {
23             get;
24             set;
25         }
26
27
28     }
29
30     public class ServerGroup
31     {
32         public List<MailServer> MailServer
33         {
34             get;
35             set;
36         }
37
38         public ServerGroup()
39         {
40             this.MailServer = new List<MailServer>();
41         }
42     }
43
44     public class MailServerGroup
45     {
46         public string Provider
47         {
48             get;
49             set;
50         }
51         public List<ServerGroup> ServerGroup;
52
53         public MailServerGroup()
54         {
55             this.ServerGroup = new List<ServerGroup>();
56         }
57     }

Note: 此例中的configSections中处理配置节点的类要换成MailServerGroupHandler,如下

1 <configSections>
2 <section name="MailServerGroup" type="ConsoleApplication11.MailServerGroupHandler,ConsoleApplication11"/>
3
4   </configSections>

现在我们可以在主函数中编写测试代码了:

 1 static void Main(string[] args)
 2         {
 3
 4             MailServerGroup mailServerGroup = (MailServerGroup)ConfigurationManager.GetSection("MailServerGroup");
 5             Console.WriteLine(mailServerGroup.Provider);
 6             Console.WriteLine(new string(‘-‘,20));
 7             foreach (ServerGroup _serverGroup in mailServerGroup.ServerGroup)
 8             {
 9                 foreach (MailServer _mailServer in _serverGroup.MailServer)
10                 {
11                     Console.WriteLine(string.Format("{0}{1}{2}{3}",
12                                                 _mailServer.Client.PadRight(15, ‘ ‘) + Environment.NewLine,
13                                                 _mailServer.Address.PadRight(15, ‘ ‘) + Environment.NewLine,
14                                                 _mailServer.UserName.PadRight(15, ‘ ‘) + Environment.NewLine,
15                                                 _mailServer.PassWord.PadRight(15, ‘ ‘)));
16                     Console.WriteLine(new string(‘-‘, 20));
17                 }
18
19             }
20             PressQToExist();
21         }
22
23
24         static void PressQToExist()
25         {
26             Console.WriteLine("Press Q to exist.");
27             ConsoleKey key;
28             do
29             {
30                 key = Console.ReadKey().Key;
31             } while (key != ConsoleKey.Q);
32         }

运行结果:

时间: 2024-10-09 09:02:02

.NET中ConfigurationManager.GetSection、ConfigurationSection、ConfigurationElement、ConfigurationElementCollection的用法的相关文章

configurationmanager.getsection usage example.

1.app.config(note that attribute case sensitive!) <?xml version="1.0" encoding="utf-8" ?> <configuration> <!--configsections must be placed above most! or there may be a "Configuration System Failed to Initialize&qu

linux中vim编辑器各种常用命令及用法

linux中vim编辑器的常用命令以及用法(注意严格区分大小写以及中英文): vim编辑器有三种模式,分别是:编辑模式,输入模式以及末行模式. 模式转换: 编辑模式>>>输入模式: i:在光标所在字符前面,转为输入模式(即转完后在光标所在字符前输入):                      I:在光标所在行的行首,转为输入模式(即转完后在行首输入,不包括行首空                         白) a:在光标所在字符后,转为输入模式(即转完后在光标所在字符后面输入):

Notepad++中NppExec的使用之一:基本用法

一直用NPP,很长时间了,最近才学习它的各种插件,这篇文章是根据NppExec的用户指南写的.很多地方是翻译的,但不全是翻译,同时也有些东西没有翻译. 一.何为NppExec 简单的说,这个插件可以让用户在NPP中直接运行一些命令和程序,而不用启动这些命令和程序对应的实际工具或编译器. 1. NppExec是... NppExec是介于Notepad++和外部工具/编译器之间的一个中间件.它允许用户在NPP中直接运行这些工具/编译器. NppExec是一个控制台(Console)窗口,它能展示运

Oracle中start with...connect by子句的用法

connect by 是结构化查询中用到的,其基本语法是:select - from tablename start with 条件1connect by 条件2where 条件3;例:select * from tablestart with org_id = 'HBHqfWGWPy'connect by prior org_id = parent_id; 简单说来是将一个树状结构存储在一张表里,比如一个表中存在两个字段:org_id,parent_id那么通过表示每一条记录的parent是谁

JavaScript中常见的数组操作函数及用法

昨天写了个帖子,汇总了下常见的JavaScript中的字符串操作函数及用法.今天正好有时间,也去把JavaScript中常见的数组操作函数及用法总结一下,这样方便大家准备参考.如果恰好你也在准备各种笔试,希望对你有所帮助.同时,也欢迎补充. 1.数组创建 创建数组应该是最简单的了,有用数组字面量创建和数组构造函数两种方法,见下: var array1 = new Array(); var array2 = []; 上面是创建数组的最常见的两种方法,其中第二种方法因为简单直观而被开发者推崇.其中,

C#中Trim()、TrimStart()、TrimEnd()的用法

http://www.cnblogs.com/carekee/articles/2094731.html C#中Trim().TrimStart().TrimEnd()的用法: 这三个方法用于删除字符串头尾出现的某些字符.Trim()删除字符串头部及尾部出现的空格,删除的过程为从外到内,直到碰到一个非空格的字符为止,所以 不管前后有多少个连续的空格都会被删除掉.TrimStart()只删除字符串的头部的空格.TrimEnd()只删除字符串尾部的空格.       如果这三个函数带上字符型数组的参

Oracle中INSTR、SUBSTR和NVL的用法

Oracle中INSTR.SUBSTR和NVL的用法 INSTR用法:INSTR(源字符串, 要查找的字符串, 从第几个字符开始, 要找到第几个匹配的序号) 返回找到的位置,如果找不到则返回0. 默认查找顺序为从左到右.当起始位置为负数的时候,从右边开始查找.若起始位置为0,返回值为0. SELECT INSTR('CORPORATE FLOOR', 'OR', 0, 1) FROM DUAL; 返回值为0 SELECT INSTR('CORPORATE FLOOR', 'OR', 2, 1)

【Java学习笔记之三十三】详解Java中try,catch,finally的用法及分析

这一篇我们将会介绍java中try,catch,finally的用法 以下先给出try,catch用法: try { //需要被检测的异常代码 } catch(Exception e) { //异常处理,即处理异常代码 } 代码区如果有错误,就会返回所写异常的处理. 首先要清楚,如果没有try的话,出现异常会导致程序崩溃.而try则可以保证程序的正常运行下去,比如说: try { int i = 1/0; } catch(Exception e) { ........ } 一个计算的话,如果除数

Linux中chown和chmod的区别和用法

Linux中chown和chmod的区别和用法(转) chmod修改第一列内容,chown修改第3.4列内容: chown用法: 用来更改某个目录或文件的用户名和用户组. chown 用户名:组名 文件路径(可以是绝对路径也可以是相对路径) 例1:chown root:root /tmp/tmp1 就是把tmp下的tmp1的用户名和用户组改成root和root(只修改了tmp1的属组). 例2:chown -R root:root /tmp/tmp1 就是把tmp下的tmp1下的所有文件的属组都