.Net中的System.Configuration命名空间为我们在web.config或者app.config中自定义配置提供了完美的支持。最近看到一些项目中还在自定义xml文件做程序的配置,所以忍不住写一篇用系统自定义配置的随笔了。

如果你已经对自定义配置了如指掌,请忽略这篇文章。

言归正传,我们先来看一个最简单的自定义配置

  1. <?xml version="1.0" encoding="utf-8" ?>
  2. <configuration>
  3. <configSections>
  4. <section name="simple" type="ConfigExample.Configuration.SimpleSection,ConfigExample"/>
  5. </configSections>
  6. <simple maxValue="20" minValue="1"></simple>
  7. </configuration>

在配置文件中使用自定义配置,需要在configSections中添加一个section元素,并制定此section元素对应的类型和名字。然后再在configuration根节点下面添加此自定义配置,如上例中的simple节点。simple节点只有两个整形数的属性maxValue和minValue。

要在程序中使用自定义配置我们还需要实现存取这个配置块的类型,一般需要做如下三件事:
1. 定义类型从System.Configuration.ConfigurationSection继承
2. 定义配置类的属性,这些属性需要用ConfigurationProperty特性修饰,并制定属性在配置节中的名称和其他一些限制信息
3. 通过基类的string索引器实现属性的get ,set

非常简单和自然,如下是上面配置类的实现:

  1. public class SimpleSection:System.Configuration.ConfigurationSection
  2. {
  3. [ConfigurationProperty("maxValue",IsRequired=false,DefaultValue=Int32.MaxValue)]
  4. public int MaxValue
  5. {
  6. get
  7. {
  8. return (int)base["maxValue"];
  9. }
  10. set
  11. {
  12. base["maxValue"] = value;
  13. }
  14. }
  15.  
  16. [ConfigurationProperty("minValue",IsRequired=false,DefaultValue=)]
  17. public int MinValue
  18. {
  19. get { return (int) base["minValue"];}
  20. set { base["minValue"] = value; }
  21. }
  22.  
  23. [ConfigurationProperty("enabled",IsRequired=false,DefaultValue=true)]
  24. public bool Enable
  25. {
  26. get
  27. {
  28. return (bool)base["enabled"];
  29. }
  30. set
  31. {
  32. base["enabled"] = value;
  33. }
  34. }
  35. }

这样子一个简单的配置类就完成了,怎么在程序中使用这个配置呢?需要使用ConfigurationManager类(要引用System.configuration.dll这个dll只有在.Net2.0之后的版本中才有)的GetSection方法获得配置就可以了。如下代码:

  1. SimpleSection simple = ConfigurationManager.GetSection("simple") as SimpleSection;
  2. Console.WriteLine("simple minValue={0} maxValue = {1}",simple.MinValue,simple.MaxValue);

这个配置类太过简陋了,可能有时候我们还需要更复杂的构造,比如在配置类中使用类表示一组数据,下面我们看一个稍微复杂一点的自定义配置

  1. <?xml version="1.0" encoding="utf-8" ?>
  2. <configuration>
  3. <configSections>
  4. <section name="complex" type="ConfigExample.Configuration.ComplexSection,ConfigExample"/>
  5. </configSections>
  6. <complex height="190">
  7. <child firstName="James" lastName="Bond"/>
  8. </complex>
  9. </configuration>

这个配置的名字是complex,他有一个属性height,他的节点内还有一个child元素这个元素有两个属性firstName和lastName;对于这个内嵌的节点该如何实现呢?首先我们需要定义一个类,要从ConfigurationElement类继承,然后再用和SimpleSection类似的方法定义一些用ConfigurationProperty特性修饰的属性就可以了,当然属性值的get,set也要使用基类的索引器。如下实现:

  1. public class ComplexSection : ConfigurationSection
  2. {
  3. [ConfigurationProperty("height", IsRequired = true)]
  4. public int Height
  5. {
  6. get
  7. {
  8. return (int)base["height"];
  9. }
  10. set
  11. {
  12. base["height"] = value;
  13. }
  14. }
  15.  
  16. [ConfigurationProperty("child", IsDefaultCollection = false)]
  17. public ChildSection Child
  18. {
  19. get
  20. {
  21. return (ChildSection)base["child"];
  22. }
  23. set
  24. {
  25. base["child"] = value;
  26. }
  27. }
  28. }
  29.  
  30. public class ChildSection : ConfigurationElement
  31. {
  32. [ConfigurationProperty("firstName", IsRequired = true, IsKey = true)]
  33. public string FirstName
  34. {
  35. get
  36. {
  37. return (string)base["firstName"];
  38. }
  39. set
  40. {
  41. base["firstName"] = value;
  42. }
  43. }
  44.  
  45. [ConfigurationProperty("lastName", IsRequired = true)]
  46. public string LastName
  47. {
  48. get
  49. {
  50. return (string)base["lastName"];
  51. }
  52. set
  53. {
  54. base["lastName"] = value;
  55. }
  56. }
  57. }

还有稍微再复杂一点的情况,我们可能要在配置中配置一组相同类型的节点,也就是一组节点的集合。如下面的配置:

  1. <?xml version="1.0" encoding="utf-8" ?>
  2. <configuration>
  3. <configSections>
  4. <section name="complex" type="ConfigExample.Configuration.ComplexSection,ConfigExample"/>
  5. </configSections>
  6. <complex height="190">
  7. <child firstName="James" lastName="Bond"/>
  8.  
  9. <children>
  10. <add firstName="Zhao" lastName="yukai"/>
  11. <add firstName="Lee" lastName="yukai"/>
  12. <remove firstName="Zhao"/>
  13. </children>
  14. </complex>
  15. </configuration>

请看children节点,它就是一个集合类,在它里面定义了一组add元素,也可以有remove节点把已经添进去的配置去掉。

要使用自定义节点集合需要从ConfigurationElementCollection类继承一个自定义类,然后要实现此类GetElementKey(ConfigurationElement element)和ConfigurationElement CreateNewElement()两个方法;为了方便的访问子节点可以在这个类里面定义只读的索引器。请看下面的实现

  1. public class Children : ConfigurationElementCollection
  2. {
  3. protected override object GetElementKey(ConfigurationElement element)
  4. {
  5. return ((ChildSection)element).FirstName;
  6. }
  7.  
  8. protected override ConfigurationElement CreateNewElement()
  9. {
  10. return new ChildSection();
  11. }
  12.  
  13. public ChildSection this[int i]
  14. {
  15. get
  16. {
  17. return (ChildSection)base.BaseGet(i);
  18. }
  19. }
  20.  
  21. public ChildSection this[string key]
  22. {
  23. get
  24. {
  25. return (ChildSection)base.BaseGet(key);
  26. }
  27. }
  28.  
  29. }

当然要使用此集合类我们必须在Complex类中添加一个此集合类的属性,并要指定集合类的元素类型等属性,如下:

  1. [ConfigurationProperty("children", IsDefaultCollection = false)]
  2. [ConfigurationCollection(typeof(ChildSection), CollectionType = ConfigurationElementCollectionType.AddRemoveClearMap, RemoveItemName = "remove")]
  3. public Children Children
  4. {
  5. get
  6. {
  7. return (Children)base["children"];
  8. }
  9. set
  10. {
  11. base["children"] = value;
  12. }
  13. }

我们会经常用到类似appSettings配置节的键值对的构造,这时候我们就不必再自己实现了,我们可以直接使用现有的System.Configuration.NameValueConfigurationCollection类来定义一个自定义的键值对。可以在Complex类中定义如下属性

  1. [ConfigurationProperty("NVs", IsDefaultCollection = false)]
  2. public System.Configuration.NameValueConfigurationCollection NVs
  3. {
  4. get
  5. {
  6. return (NameValueConfigurationCollection)base["NVs"];
  7. }
  8. set
  9. {
  10. base["NVs"] = value;
  11. }
  12. }

然后在配置文件的complex节中添加键值对配置

  1. <NVs>
  2. <add name="abc" value="123"/>
  3. <add name="abcd" value="12d3"/>
  4. </NVs>

到这儿已经基本上可以满足所有的配置需求了。不过还有一点更大但是不复杂的概念,就是sectionGroup。我们可以自定义SectionGroup,然后在sectionGroup中配置多个section;分组对于大的应用程序是很有意义的。

如下配置,配置了一个包含simple和一个complex两个section的sectionGroup

  1. <?xml version="1.0" encoding="utf-8" ?>
  2. <configuration>
  3. <configSections>
  4. <sectionGroup type="ConfigExample.Configuration.SampleSectionGroup,ConfigExample" name="sampleGroup">
  5. <section type="ConfigExample.Configuration.SimpleSection,ConfigExample" allowDefinition="Everywhere" name="simple" />
  6. <section type="ConfigExample.Configuration.ComplexSection,ConfigExample" allowDefinition="Everywhere" name="complex"/>
  7. </sectionGroup>
  8. </configSections>
  9. <sampleGroup>
  10. <simple maxValue="20" minValue="1">
  11. </simple>
  12.  
  13. <complex height="190">
  14. <child firstName="James" lastName="Bond"/>
  15. <children>
  16. <add firstName="Zhao" lastName="yukai"/>
  17. <add firstName="Lee" lastName="yukai"/>
  18. <remove firstName="Zhao"/>
  19. </children>
  20. <NVs>
  21. <add name="abc" value="123"/>
  22. <add name="abcd" value="12d3"/>
  23. </NVs>
  24. </complex>
  25. </sampleGroup>
  26. </configuration>

为了方便的存取sectionGroup中的section我们可以实现一个继承自System.Configuration.ConfigurationSectionGroup类的自定义类。实现很简单,就是通过基类的Sections[“sectionName”]索引器返回Section。如下:

  1. public class SampleSectionGroup : System.Configuration.ConfigurationSectionGroup
  2. {
  3. public SimpleSection Simple
  4. {
  5. get
  6. {
  7. return (SimpleSection)base.Sections["simple"];
  8. }
  9. }
  10.  
  11. public ComplexSection Complex
  12. {
  13. get
  14. {
  15. return (ComplexSection)base.Sections["complex"];
  16. }
  17. }
  18. }

在Web.config或App.config中的添加自定义配置的更多相关文章

  1. 修改和获取web.config或app.config文件appSettings配置节中的Add里的value属性 函数

    1: /// <summary> 2: /// 修改web.config或app.config文件appSettings配置节中的Add里的value属性 3: /// </summ ...

  2. 在Web.config或App.config中的添加自定义配置 <转>

        .Net中的System.Configuration命名空间为我们在web.config或者app.config中自定义配置提供了完美的支持.最近看到一些项目中还在自定义xml文件做程序的配置 ...

  3. 说说Web.Config与App.Config

    说到web.config和app.config大家都很熟悉,我们都叫他们配置文件,平时用的多,注意的少.两个有啥区别呢,很简单,一句话:如果是web程序,如webform项目类型和mvc项目类型就是w ...

  4. 一个web.Config或app.Config自定义段configSections的示例

    一个web.Config或app.Config自定义段configSections的示例 越来越觉得,直接用配置文件app.Config或web.Config配置应用系统的运行参数,比自己做一个xml ...

  5. 一个web.Config或app.Config自定义段configSections的示例--转

    直接用配置文件app.Config或web.Config配置应用系统的运行参数,比自己做一个xml配置文件,简洁方便得多.这两个配置文件不仅有常见的connectionStrings和appSetti ...

  6. .NET下对Web.config与App.Config的增删改操作的代码

    把代码过程常用的内容做个收藏,下边代码段是关于 .NET下对Web.config与App.Config的增删改操作的代码. <?xml version="1.0" encod ...

  7. .net分布在指定文件夹的web.confgi或者app.config

    .Net里面,ConfigurationManager默认读取的是Web.config或者App.config但是,什么都放在这两个文件里面,感觉太多了,也不好管理配置.于是参考了下别人的资料,自己写 ...

  8. web.config or app.config 中configSections配置节点

    以前还真没见过,今天看项目中有在用,简单写了个Demo,这样配置的好处就是可以自定义配置,更加模块化,直接上代码; 1.配置文件 由于我创建的是一个控制台项目,所以配置文件是App.Config:(这 ...

  9. 配置文件(Machine.config、Web.config、App.config)

    Machine.config1.该文件在Windows目录下\Microsoft.net\framework\[version]\Config\2.为了提高性能,该文件只包含不同于默认值的设置.并且定 ...

随机推荐

  1. 夺命雷公狗-----React---9--map数据的遍历

    比如我们要实现的是这种效果: 用这种方法来写,她只能写死在哪,没啥意思,所以我们定义一个数据,然后来测试下map方法对她遍历出来的数据 <!DOCTYPE html> <html l ...

  2. Python正则处理多行日志一例

    正则表达式基础知识请参阅<正则表达式基础知识>,本文使用正则表达式来匹配多行日志并从中解析出相应的信息. 假设现在有这样的SQL日志: SELECT * FROM open_app WHE ...

  3. Linux 中断详解 【转】

    转自:http://blog.csdn.net/tiangwan2011/article/details/7891818 原文地址 http://www.yesky.com/20010813/1921 ...

  4. Hadoop日志文件分析系统

    Hadoop日志分析系统 项目需求: 需要统计一下线上日志中某些信息每天出现的频率,举个简单的例子,统计线上每天的请求总数和异常请求数.线上大概几十台 服务器,每台服务器大概每天产生4到5G左右的日志 ...

  5. 如何清理photoshop cs6 被升级的烦人的adobe creative cloud组件

    安装photoshop cs6(虽然目前已经退出到cc 2015,不过因激活成熟度等,我还是偏向于使用cs6,够用!),默认安装adobe application manager. 不过如果不小心单独 ...

  6. Oracle 流复制实践笔记

    最近因为业务需求,需要在两个数据库之间做双向实时同步,遂实践了一把Oracle的流复制,遇到了很多疑难问题,最终也貌似成功,现记录如下. 我是使用OEM来实现流复制的. 10.进行流复制的两个数据库的 ...

  7. 《Java并发编程实战》读书笔记

    Subsections 线程安全(Thread safety)锁(lock)共享对象对象组合基础构建模块任务执行取消和关闭线程池的使用性能与可伸缩性并发程序的测试显示锁原子变量和非阻塞同步机制 一.线 ...

  8. 2016 ACM/ICPC Asia Regional Dalian Online

    1009 Sparse Graph(hdu5876) 由于每条边的权值都为1,所以最短路bfs就够了,只是要求转置图的最短路,所以得用两个set来维护,一个用来存储上次扩散还没访问的点,一个用来存储这 ...

  9. (2) 深入理解Java Class文件格式(一)

    好文转载:http://blog.csdn.net/zhangjg_blog/article/details/21486985 Class文件在Java体系结构中的位置和作用 在上一篇博客中, 大致讲 ...

  10. openvpn之搭建配置

    一.openvpn原理 openvpn通过使用公开密钥(非对称密钥,加密解密使用不同的key,一个称为Publice key,另外一个是Private key)对数据进行加密的.这种方式称为TLS加密 ...