.Net——实现IConfigurationSectionHandler接口定义处理程序处理自定义节点

             除了使用.net里面提供的内置处理程序来处理我们的自定义节点外,我们还可以通过多种方法,来自己定义处理类处理我们的自定义节点,本文主要介绍通过实现IConfigurationSectionHandler接口的方式来实现自定义处理程序。

           首先,我们先在配置文件里面写如下自定义节点:

   

 <!-- 使用自定义节点和上面的自定义处理程序-->
  <mailServerGroup provider="www.baidu.com">

    <mailServer client="http://blog.csdn.net/lhc1105">
      <address>13232@qq.com</address>
      <userName>lhc</userName>
      <password>2343254</password>
    </mailServer>

    <mailServer client="http://www.cnblogs.com/liuhuichao/">
      <address>132345232@qq.com</address>
      <userName>水田如雅</userName>
      <password>2343453254</password>
    </mailServer>

  </mailServerGroup>

              

              然后写对应类进行处理:

      

namespace MailHandlerClass
{
   public  class MailServer
    {
       //存储mailServer的子节点(<address>13232@qq.com</address><userName>lhc</userName><password>2343254</password>)的值
       //以及client的值
       private Hashtable serverNode;

       //构造函数
       public MailServer() { serverNode = new Hashtable(); }

       public Hashtable ServerNode { get { return serverNode; } }
       public string client { get { return serverNode["client"] as string; } }
       public string Address { get { return serverNode["address"] as string; } }
       public string UserName { get { return serverNode["userName"] as string; } }
       public string PassWord { get { return serverNode["password"] as string; } }

    }

   //对应mailServerGroup
   public class MailServerConfig : List<MailServer> {
       //映射provider值
       public string Provider { get; set; }

   }

    //自定义配置节点mailServerGroup的处理程序
   public class MailServerConfigurationHandler : IConfigurationSectionHandler { 

       //section为MailServerGroup节点

       public  object  Create(object parent, object configContext, System.Xml.XmlNode section)
        {
 	        //设置方法返回配置对象,可以是任何类型
            MailServerConfig config = new MailServerConfig();

           //获取节点的属性信息
            config.Provider = section.Attributes["provider"] == null ? "" : section.Attributes["provider"].Value;

           //获取MailServer节点
            foreach (System.Xml.XmlNode child in section.ChildNodes)
            {
                MailServer server = new MailServer();
                //添加Client属性
                if (child.Attributes["client"]!=null)
                {
                    server.ServerNode.Add("client", child.Attributes["client"].Value);
                }

                //获取MailServer下的Name,username,password节点
                foreach (System.Xml.XmlNode grandChild in child.ChildNodes)
                {
                    //添加文本
                    server.ServerNode.Add(grandChild.Name, grandChild.InnerText);
                }

                //将server加入MailServerConfig
                config.Add(server);
            }

            return config;
        }
}
}

            其实从代码可以看出,自定义处理类的实现思路还是用hashtable来实现key-value的读取与存储+对XML的处理;

              之后,我们在配置文件中将上面的类和节点关联起来:

<configuration>

  <!--定义处理mailServerGroup配置节的类-->
  <configSections>
    <section name="mailServerGroup" type="MailHandlerClass.MailServerConfigurationHandler,实现IConfigurationSectionHandler接口"/>

    <!--【注意】type:指定用来执行如下操作的配置节处理程序类的名称:处理在 name 属性中指定的节或元素中的配置设置。使用以下格式:type=" Fully qualified class name , assembly file name , version , culture , public key token "定义必须匹配程序集引用。-->

  </configSections>

       一定要注意type指定值时参数的位置!!!!!不然会出现加载不上处理程序的错误。

            写段代码测试下:

             

namespace MailHandlerClass
{
    //也可以通过继承ConfigurationSection类来完成
    class Program
    {
        static void Main(string[] args)
        {
            MailServerConfig mailServerConfig = (MailServerConfig)ConfigurationManager.GetSection("mailServerGroup");

            //读取节点值
            mailServerConfig.ForEach(m => {
                Console.WriteLine(m.client+";"+m.Address+";"+m.UserName+";"+m.PassWord);
            });

        }
    }
}

             额,其实还是建议强转改为as啥的形式。

                其实配置文件刚开始看起来是这样的:

       

              

                但是学完之后,你再看配置文件,就变成了这样的:

         

                   

               感觉so easy~~~~么么哒~~~·

时间: 2024-08-30 15:15:10

.Net——实现IConfigurationSectionHandler接口定义处理程序处理自定义节点的相关文章

.Net——使用.net内置处理程序处理自定义节点Demo

         在.net中,因为对不同的节点,都对应着类去对它进行处理,.net里面为了方便,已经内置了一些类供我们使用,使我们在读取配置文件时,不必自己去定义类去处理自己定义的自定义节点.         下面我们写了这样一个配置文件:            <?xml version="1.0" encoding="utf-8" ?> <configuration> <configSections> <!--使用Ig

Flex扩展HTTPService简化调用接口定义

Flex提供MXML来描述一个HTTPService,看上可以简化开发人员的工作,但实际上这种描 述HTTPService的方式很容易产生重复代码导致代码不好维护和扩展.数据交互接口唯一定义 对系统的维护非常有利,但基于AS定义HTTPService也是一件烦琐的事情:那如何做才能够达 到方便地定义接口呢. 接口定义 以下是定义一个登陆的 HTTPService public class ILogin extends HttpBase { public function ILogin(metho

Go语言接口定义与用法示例_Golang

本文实例讲述了Go语言接口定义与用法.分享给大家供大家参考,具体如下: 在Go中,接口interface其实和其他语言的接口意思也没什么区别.interface理解其为一种类型的规范或者约定.一种类型是不是"实现"了一个接口呢?就看这种类型是不是实现了接口中定义的所有方法. 1. 接口的定义和使用. 比如 复制代码 代码如下: type I interface{     Get() int     Put(int) } 这段话就定义了一个接口,它包含两个函数Get和Put 好了,我的一

.net 如何在web.config中读取自定义节点以及注意的问题

web|问题 这几天在做一个urlMapping类库的时候用到了如何读取web.config中自定义节点, 做完后觉得挺好 现就制作过程叙述一下. web.config文件在web application中起着非常重要的作用. 它本身包含了授权,handler,compilation,globalization,错误与跟踪等一系列设置.但是当你需要一些特殊的或者想添加自己的settings时,应该如何做呢? 要创建自定义设置 要求有2步:写cs代码 和 修改web.config 代码 这里我们创

HTTP错误500.19解决方法(定义了重复的节点)_实用技巧

打开服务器的asp.net页面时出现这个错误: HTTP 错误 500.19 - Internal Server Error 无法访问请求的页面,因为该页的相关配置数据无效. 解决办法: 打开IIS,点击"高级设置": 更改应用程序池为".NET v2.0 Classic"即可,问题解决. P.s. :HTTP 500.19错误貌似不止这一个,所以上面这个只针对我碰到的如图一所示的"定义了重复的节点"的问题的解决办法.

浅析泛型类接口定义

在使用泛型定义类的过程中遇到了不少问题,特记录如下,需要的朋友可以参考下   定义最基本的泛型类如下: 复制代码 代码如下: public abstract class GetDataBase<T> :IHttpHandler, IRequiresSessionState {  protected abstract T GetModel(HttpContext context);  protected abstract IList<T> GetList(int pageSize,

Java中接口定义成员变量

在interface里面的变量都是public static final的.可以这样写:public static final int i=10或者int i=10. public interface MyInterface {  // 默认为public static int a = 10;  int a = 10; } public class MyTest {  public static void main(String[] args)  {   int a = MyInterface.

php微信高级接口调用方法(自定义菜单接口、客服接口、二维码)_php实例

怎么调用微信高级接口 微信高级接口和微信普通接口的区别 后台服务器可以调用微信的接口与微信用户进行讯息的通信,这样的行为就是在调用微信的接口,这些接口是基础接口,你不需要任何付费行为或者身份认证行为就可以调用.但是有一些高级接口,你的微信公众号必须达到一定的权限如通过微信认证才能调用自定义菜单.微信支付等高级功能. 不过微信公众帐号的测试号系统可以应用这些高级接口(微信支付等涉及交易的接口除外). 微信高级接口的调用 微信高级接口的调用需要先调用一个token_access接口,只有先调用这个接

RJ45接口定义,RJ45与RJ11的区别详解

  RJ-45接口 RJ-45接口图例 RJ45是一个常用名称,指的是由IEC (60)603-7标准化, 使用由国际性的接插件标准定义的8个位置(8针)的模块化插孔或者插头.IEC (60)603-7也是ISO/IEC 11801国际通用综合布线标准的连接硬件的参考标准. RJ-45接口可用于连接RJ-45接头,适用于由双绞线构建的网络,这种端口是最常见的,一般来说以太网集线器都会提供这种端口.我们平常所讲的多少口路由器,就是指的具有多少个RJ-45端口. 因为在快速以太网中也主要采用双绞线作