转载:http://www.educity.cn/develop/495003.html

在.Net应用程序中我们经常看到VS为我们生成的项目工程中都会含有app.config或者web.connfig这样的文件.这个文件就是我们所说的应用程序配置文件.在这个文件里面记述着一些与我们的应用程序相关的信息如数据库连接认证模式等我们在程序中可以利用ConfigurationManager的ConnectionStrings属性方便的获取配置文件中的数据库连接字符串信息。

可是有时候我们需要对它进行一些扩展加入一些自定义的元素而不是仅仅使用默认的配置.例如我们可能需要在程序启动时动态的加载某个类并对其进行初始化,而这个类或者初始化数据是我们在程序设计的时候所不知道的.相信大家都碰到过这样的问题,这里就不做过多的解释了.最好的办法无非就是把这些可能会改变的东西写进配置文件里面,到你能够确定的时候你只需要修改配置文件就Ok了,而不是产品马上上线的时候还用秒钟打开VS去改代码。

添加一些自定义的元素到配置文件中是很容易的只需要两步就能搞定:

1、 在<configSections>节点中注册你所要定义的节点名称及用于处理该节点的配置节处理程序代码如下:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<configSections>
<section name="dbFactory" type ="DbFactory.Configuration.DbFactorySection,DbFactory.Configuration" />
</configSections>
</configuration>

2、 在适当的位置添加自定义的节点代码如下:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<configSections>
<section name="dbFactory" type ="DbFactory.Configuration.DbFactorySection,DbFactory.Configuration" />
</configSections>
<dbFactory >
<default factory="sql"></default>
<factorys>
<add name="sql" assembly="HelloData" class="SqlDbFactory" />
<add name="oracle" assembly="HelloData" class="OracleDbFactory" />   
</factorys>   
</dbFactory>
</configuration>
    
 自定义节点算是添加完了,可是我们怎么在程序里面获取这些配置信息呢?相信大家很多都是玩XML的高手,用SystemXml下的一些类写个XML的解析类把我们自定义的节点信息解析出来不就得到我们想要的东西了吗?的确是这样大牛果然是大牛小弟实在是佩服!可是如果用这种方式来实现的话小弟就实在没有必要写这篇博文了。

Net框架为我们实现了很多的配置API来简化我们对配置文件的操作。在第一个步骤中我们提到了配置节处理程序这个程序就是用来读写我们自定义的节点信息的。那么我们又如何来实现一个配置节处理程序呢?首先我们来了解一下相关的类和概念。

ConfigurationSection:自定义节点都要继承该类以提供对自定义配置节的自定义处理和编程访问。

ConfigurationElement:它表示配置文件内的一个元素。

ConfigurationElementCollection:它表示包含一个子元素集合的配置元素。

有了这些类我们可以归纳起来配置文件中有两种类型的配置元素。

第一:单一型配置元素即继承于ConfigurationElement的元素它不包含任何子元素。

第二:集合型配置元素即继承于ConfigurationElementCollection的元素它包含一个子元素集合。

概念往往都比较抽象,要搞清楚这些东西我们还是结合我们上面给的例子来具体说明一下。

在<dbFactory> 配置节中有两个元素,即<default>和<factorys>而<factorys>元素又包含了两个子元素。那么在这里<default>就是单一型配置元素,而<factorys>就是集合型配置元素我们需要分别实现与这些元素相对应的类及其属性。

<default>元素它是一个单一型的元素,所以我们继承ConfigurationElement该元素中有一个factory属性那么我们在类中进行相应的定义代码如下:

代码

        public class DefaultElement : ConfigurationElement
{
[ConfigurationProperty("factory")]
public string Factory
{
get { return this["factory"] as string; }
set { this["factory"] = value; }
}
}

注意在属性定义上面我们需要注册该属性的ConfigurationProperty特性。

<factorys>子元素

代码:

public class FactoryElement : ConfigurationElement
{
[ConfigurationProperty("name")]
public string Name
{
get
{
return this["name"] as string;
}
set
{
this["name"] = value;
}
}
[ConfigurationProperty("assembly")]
public string Assembly
{
get
{
return this["assembly"] as string;
}
set
{
this["assembly"] = value;
}
}
[ConfigurationProperty("class")]
public string Class
{
get
{
return this["class"] as string;
}
set
{
this["class"] = value;
}
}
}
}

<factorys>元素是集合型元素继承ConfigurationElementCollection

代码:

  public class FactoryElements : ConfigurationElementCollection
{
protected override ConfigurationElement CreateNewElement()
{
return new FactoryElement();
}
protected override object GetElementKey(ConfigurationElement element)
{
return ((FactoryElement)element).Name;
}
public FactoryElement this[string name]
{
get
{
return BaseGet(name) as FactoryElement;
}
}
}

ConfigurationElementCollection类是个抽象类,你应该显示的实现它的CreateNewElement方法和GetElementKey方法。

<dbFactory>节点继承于ConfigurationSection

代码

        public class DbFactorySection : ConfigurationSection
{
[ConfigurationProperty("default")]
public DefaultElement DefaultFactory
{
get { return this["default"] as DefaultElement; }
set { this["default"] = value; }
}
[ConfigurationProperty("factorys")] public FactoryElements Factorys
{
get
{
return this["factorys"] as FactoryElements;
}
set
{
this["factorys"] = value;
}
} }
     配置节处理程序终于写完了。把这四个类放在同一个工程目录下,编译成一个DLL,在你需要获取配置信息的地方引用这个DLL,用DbFactorySection section = ConfigurationManager.GetSection( “dbFactory”) as DbFactorySection;试试section是不是你想要的东西呢?

C# 创建自定义配置节点1的更多相关文章

  1. C#创建自定义配置节点

    转载:http://www.educity.cn/develop/495003.html 在.Net应用程序中我们经常看到VS为我们生成的项目工程中都会含有app.config或者web.connfi ...

  2. App.config和Web.config配置文件的自定义配置节点

    前言 昨天修改代码发现了一个问题,由于自己要在WCF服务接口中添加了一个方法,那么在相应调用的地方进行更新服务就可以了,不料意外发生了,竟然无法更新.左查右查终于发现了问题.App.config配置文 ...

  3. 迁移appseting.json创建自定义配置中心

    创建一个自定义的配置中心,将框架中各类配置,迁移至数据库,支持切换数据库,热重载. 说在前面的话 自使用.net Core框架以来,配置大多存在json文件中: [框架默认加载配置]文件为appset ...

  4. VS2012 常用web.config配置解析之自定义配置节点

    在web.config文件中拥有一个用户自定义配置节点configSections,这个节点可以方便用户在web.config中随意的添加配置节点,让程序更加灵活(主要用于第三方插件的配置使用) 自定 ...

  5. ASP.NET系列:自定义配置节点的复用

    appSettings太简单,为每个程序自定义配置节点太复杂,因此要解决app.config&web.config自定义配置的复用问题. 1.读取不依赖SectionName,根节点可以定义为 ...

  6. 使用 ConfigurationSection 创建自定义配置节

    我们可以通过用自己的 XML 配置元素来扩展标准的 ASP.NET 配置设置集,要完成这一功能,我们必须实现继承System.Configuration.ConfigurationSection 类来 ...

  7. 自定义配置节点configSections的使用

    //App.config <?xml version="1.0" encoding="utf-8" ?><configuration>  ...

  8. .Net 配置文件--继承ConfigurationSection实现自定义处理类处理自定义配置节点

    除了使用继承IConfigurationSectionHandler的方法定义处理自定义节点的类,还可以通过继承ConfigurationSection类实现同样效果. 首先说下.Net配置文件中一个 ...

  9. .Net 配置文件——继承ConfigurationSection实现自定义处理类处理自定义配置节点

    除了使用继承IConfigurationSectionHandler的方法定义处理自定义节点的类,还可以通过继承ConfigurationSection类实现同样效果. 首先说下.Net配置文件中一个 ...

随机推荐

  1. java路障CyclicBarrier

    当所有线程都执行到某行代码,才可已往下执行: package threadLock; import java.util.Random; import java.util.concurrent.Brok ...

  2. 洛谷 P1101单词方阵

    我已经,是这个世界上,最幸福的女孩了                                                                         ——<末日时 ...

  3. android View的测量和绘制

    本篇内容来源于android 群英传(徐易生著) 我写到这里,是觉得徐易生讲的确实很好, 另外加入了一些自己的理解,便于自己基础的提高. 另外参考:http://www.gcssloop.com/cu ...

  4. C++输入输出常用格式(cin,cout,stringstream)

    输入格式 1.cin>>a; 最基本的格式,适用于各种类型.会过滤掉不可见字符例如空格,TAB,回车等 2.cin>>noskipws>>ch[i]; 使用了 no ...

  5. Session和Cookie的用法及区别

    1. Session.Cookie是什么 1.1 概念理解 要了解session和cookie是什么,先要了解以下几个概念. 1.1.1 无状态的HTTP协议 协议:是指计算机通信网络中两台计算机之间 ...

  6. C++基础之迭代器

    迭代器的分类 插入迭代器(insert iterator):绑定一个容器上后可以向容器中插入元素: 流迭代器(stream iterator):绑定在输入输出流中,可以遍历关联的流: 反向迭代器(re ...

  7. centos使用android studio遇到的一些问题

    1.下载完成后进入bin目录启动 ./studio 2. 由于google被墙,SDK 下载不了, 照此教程添加下载源 http://jingyan.baidu.com/album/adc815137 ...

  8. Java线程池基础

    目录: 一.线程池概述 二.线程池参数 三.线程池的执行过程 四.线程池的主要实现 五.线程池的使用 六.线程池的正确关闭方式 七.线程池参数调优 一.线程池概述 1.线程池类 目前线程池类一般有两个 ...

  9. linux下安装pip(centos)

    centos系统中自带python2.7.5但是却没有pip工具 直接yum install pip会提示没有这个包 解决方案: 需要先安装扩展源EPEL. EPEL(http://fedorapro ...

  10. JAVA Atm测试实验心得

    通过一个假期的自学,完成了老师布置的样卷任务.使用Escipse编写一个学生成绩的管理系统. 一开始两眼摸黑,通过观看Java课程的视频,地址:https://www.bilibili.com/vid ...