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

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

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

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

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

   1:  <?xml version="1.0" encoding="utf-8" ?>
   2:  <configuration>
   3:    <configSections>
   4:      <section name="dbFactory"
   5:               type ="DbFactory.Configuration.DbFactorySection,DbFactory.Configuration" />
   6:    </configSections>
   7:  </configuration>
     2、 在适当的位置添加自定义的节点代码如下:
   1:  <?xml version="1.0" encoding="utf-8" ?>
   2:  <configuration>
   3:    <configSections>
   4:      <section name="dbFactory"
   5:               type ="DbFactory.Configuration.DbFactorySection,DbFactory.Configuration" />
   6:    </configSections>
   7:   
   8:    <dbFactory >
   9:      <default factory="sql"></default>
  10:      <factorys>
  11:        <add name="sql"  assembly="HelloData"  class="SqlDbFactory" />
  12:        <add name="oracle" assembly="HelloData" class="OracleDbFactory" />        
  13:      </factorys>      
  14:    </dbFactory>
  15:  </configuration>

.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, "Courier New", courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }

 

.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, "Courier New", courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }

自定义节点算是添加完了,可是我们怎么在程序里面获取这些配置信息呢?相信大家很多都是玩XML的高手,用SystemXml下的一些类写个XML的解析类把我们自定义的节点信息解析出来不就得到我们想要的东西了吗?的确是这样大牛果然是大牛小弟实在是佩服!可是如果用这种方式来实现的话小弟就实在没有必要写这篇博文了。

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

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

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

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

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

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

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

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

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

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

代码

   1:  public class DefaultElement : ConfigurationElement
   2:      {
   3:          [ConfigurationProperty("factory")]
   4:          public string Factory
   5:          {
   6:              get { return this["factory"] as string; }
   7:              set { this["factory"] = value; }
   8:          }
   9:      }

.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, "Courier New", courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }

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

<factorys>子元素

代码:

   1:      public class FactoryElement : ConfigurationElement
   2:      {
   3:          [ConfigurationProperty("name")]
   4:          public string Name
   5:          {
   6:              get
   7:              {
   8:                  return this["name"] as string;
   9:              }
  10:              set
  11:              {
  12:                  this["name"] = value;
  13:              }
  14:          }
  15:          [ConfigurationProperty("assembly")]
  16:          public string Assembly
  17:          {
  18:              get
  19:              {
  20:                  return this["assembly"] as string;
  21:              }
  22:              set
  23:              {
  24:                  this["assembly"] = value;
  25:              }
  26:          }
  27:          [ConfigurationProperty("class")]
  28:          public string Class
  29:          {
  30:              get
  31:              {
  32:                  return this["class"] as string;
  33:              }
  34:              set
  35:              {
  36:                  this["class"] = value;
  37:              }
  38:          }
  39:      }

.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, "Courier New", courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }

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

代码:

   1:      public class FactoryElements : ConfigurationElementCollection
   2:      {
   3:          protected override ConfigurationElement CreateNewElement()
   4:          {
   5:              return new FactoryElement();
   6:          }
   7:          protected override object GetElementKey(ConfigurationElement element)
   8:          {
   9:              return ((FactoryElement)element).Name;
  10:          }
  11:          public FactoryElement this[string name]
  12:          {
  13:              get
  14:              {
  15:                  return BaseGet(name) as FactoryElement;
  16:              }
  17:          }
  18:      }

.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, "Courier New", courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }

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

<dbFactory>节点继承于ConfigurationSection

代码

   1:  public class DbFactorySection : ConfigurationSection
   2:  {
   3:      [ConfigurationProperty("default")]
   4:      public DefaultElement DefaultFactory
   5:      {
   6:          get { return this["default"] as DefaultElement; }
   7:          set { this["default"] = value; }
   8:      }
   9:      [ConfigurationProperty("factorys")]
  10:   
  11:      public FactoryElements Factorys
  12:      {
  13:          get
  14:          {
  15:              return this["factorys"] as FactoryElements;
  16:          }
  17:          set
  18:          {
  19:              this["factorys"] = value;
  20:          }
  21:      }
  22:  } 
       配置节处理程序终于写完了。把这四个类放在同一个工程目录下,编译成一个DLL,在你需要获取配置信息的地方引用这个DLL,用DbFactorySection section = ConfigurationManager.GetSection( “dbFactory”) as DbFactorySection;试试section是不是你想要的东西呢?

.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, "Courier New", courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }

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

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

    转载: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. C# 多线程(lock,Monitor,Mutex,同步事件和等待句柄)

    本篇从 Monitor,Mutex,ManualResetEvent,AutoResetEvent,WaitHandler 的类关系图开始,希望通过本篇的介绍能对常见的线程同步方法有一个整体的认识,而 ...

  2. ArcGIS for Android示例解析之空间查询-----QueryTask

    转自:http://blog.csdn.net/wozaifeiyang0/article/details/7331450 QueryTask 查询功能在GIS中是一个不可或缺的重要功能,示例中提供了 ...

  3. eclipse tomcat内存溢出,加大内存

    保存图片失败,请点击这里获得详细信息. 加入 -Xms256M -Xmx512M -XX:PermSize=256m -XX:MaxPermSize=512m

  4. hadoop部署小结的命令

    hadoop部署总结的命令 学习笔记,转自:hadoop部署总结的命令http://www.aboutyun.com/thread-5385-1-1.html(出处: about云开发)

  5. 百度参投 Uber中国12亿美元融资已到账

    滴快车单单2.5倍,注册地址:http://www.udache.com/ 如何注册Uber司机(全国版最新最详细注册流程)/月入2万/不用抢单:http://www.cnblogs.com/mfry ...

  6. js 类似发微博或者微信朋友圈的时间显示 刚刚 几天前

    群里的一个小伙伴(NightEagle)写的,共享出来了,我就做个记录. function getDateDiff(dateStr) { var publishTime = getDateTimeSt ...

  7. 音频播放(iOS开发)

    音频处理 一.录音 录音应用场景 语音聊天 即时通讯软件中,都包含语音发送功能 语音备忘录 录一段音频,来记录某件事情 录音功能实现 导入AVFoundation框架 作用:一些多媒体的处理,基本上都 ...

  8. 《Effect Java》学习笔记1———创建和销毁对象

    第二章 创建和销毁对象 1.考虑用静态工厂方法代替构造器 四大优势: i. 有名称 ii. 不必在每次调用它们的时候都创建一个新的对象:   iii. 可以返回原返回类型的任何子类型的对象: JDBC ...

  9. 编程实例--for循环,找出0~100之间与8有关的正整数

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  10. Asp.net Mvc 自定义Session (二)

    在 Asp.net Mvc 自定义Session (一)中我们把数据缓存工具类写好了,今天在我们在这篇把 剩下的自定义Session写完 首先还请大家跟着我的思路一步步的来实现,既然我们要自定义Ses ...