• .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啥的形式。

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

  • 相关阅读:
    AjaxControlToolKit(整理)三.......(35个控件)简单介绍
    C#多线程学习
    《深入浅出WPF》视频列表
    【Redis】Redis功能及性能
    MySQL性能优化
    【Redis】Redis常用命令
    php项目相关资源
    JAVA基础知识总结:十一
    JAVA基础知识总结:九
    JAVA基础知识总结:十
  • 原文地址:https://www.cnblogs.com/sjqq/p/6909806.html
Copyright © 2020-2023  润新知