.Net——实现IConfigurationSectionHandler接口定义处理程序处理自定义节点
2015-06-23 21:40
555 查看
除了使用.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~~~~么么哒~~~·
首先,我们先在配置文件里面写如下自定义节点:
<!-- 使用自定义节点和上面的自定义处理程序-->
<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~~~~么么哒~~~·
相关文章推荐
- .Net——实现IConfigurationSectionHandler接口定义处理程序处理自定义节点
- 面对工业4.0,我国工业企业的挑战与对策
- 二路插入排序
- ubuntu安装rabbitvcs
- UIStepper
- iOS开发笔记--[__NSArrayI addObjectsFromArray:]: unrecognized selector错误
- 程序员们有福了:独立于GUI的Java应用框架 Reflex 诞生了!
- 冲刺第二十三天
- 设计模式之工厂方法模式一
- python爬取多页gif图像
- windows程序设计(滚动条)
- leetcode-6ZigZag Conversion
- sysbench压力测试,mysql压力测试
- Codeforces 552E Vanya and Brackets
- 黑马程序员--泛型
- (入门菜鸟级别程序员)微信开发java遇到的难题,分享给其他新人微信开发者
- python爬虫系列之爬取多页gif图像
- 工业4.0从构建全生命周期数据图谱开始
- POJ3067:Japan(树状数组求逆序对)
- leetcode-52-N-Queens II