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

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

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

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

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

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

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

public class SimpleSection:System.Configuration.ConfigurationSection
{[ConfigurationProperty("maxValue",IsRequired=false,DefaultValue=Int32.MaxValue)]public int MaxValue{get{return  (int)base["maxValue"];}set{base["maxValue"] = value;}}[ConfigurationProperty("minValue",IsRequired=false,DefaultValue=1)]public int MinValue{get { return (int) base["minValue"];}set { base["minValue"] = value; }}[ConfigurationProperty("enabled",IsRequired=false,DefaultValue=true)]public bool Enable{get{return (bool)base["enabled"];}set{base["enabled"] = value;}}
}

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

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

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

<?xml version="1.0" encoding="utf-8" ?>
<configuration><configSections><section name="complex" type="ConfigExample.Configuration.ComplexSection,ConfigExample"/></configSections><complex height="190"><child firstName="James" lastName="Bond"/></complex>
</configuration>

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

public class ComplexSection : ConfigurationSection
{[ConfigurationProperty("height", IsRequired = true)]public int Height{get{return (int)base["height"];}set{base["height"] = value;}}[ConfigurationProperty("child", IsDefaultCollection = false)]public ChildSection Child{get{return (ChildSection)base["child"];}set{base["child"] = value;}}
}public class ChildSection : ConfigurationElement
{[ConfigurationProperty("firstName", IsRequired = true, IsKey = true)]public string FirstName{get{return (string)base["firstName"];}set{base["firstName"] = value;}}[ConfigurationProperty("lastName", IsRequired = true)]public string LastName{get{return (string)base["lastName"];}set{base["lastName"] = value;}}
}

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

<?xml version="1.0" encoding="utf-8" ?>
<configuration><configSections><section name="complex" type="ConfigExample.Configuration.ComplexSection,ConfigExample"/></configSections><complex height="190"><child firstName="James" lastName="Bond"/><children><add firstName="Zhao" lastName="yukai"/><add firstName="Lee" lastName="yukai"/><remove firstName="Zhao"/></children></complex>
</configuration>

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

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

public class Children : ConfigurationElementCollection
{protected override object GetElementKey(ConfigurationElement element){return ((ChildSection)element).FirstName;}protected override ConfigurationElement CreateNewElement(){return new ChildSection();}public ChildSection this[int i]{get{return (ChildSection)base.BaseGet(i);}}public ChildSection this[string key]{get{return (ChildSection)base.BaseGet(key);}}}

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

[ConfigurationProperty("children", IsDefaultCollection = false)][ConfigurationCollection(typeof(ChildSection), CollectionType = ConfigurationElementCollectionType.AddRemoveClearMap, RemoveItemName = "remove")]public Children Children{get{return (Children)base["children"];}set{base["children"] = value;}
}

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

[ConfigurationProperty("NVs", IsDefaultCollection = false)]public System.Configuration.NameValueConfigurationCollection NVs{get{return (NameValueConfigurationCollection)base["NVs"];}set{base["NVs"] = value;}
}

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

<NVs><add name="abc" value="123"/><add name="abcd" value="12d3"/>
</NVs>

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

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

<?xml version="1.0" encoding="utf-8" ?>
<configuration><configSections><sectionGroup type="ConfigExample.Configuration.SampleSectionGroup,ConfigExample" name="sampleGroup"><section type="ConfigExample.Configuration.SimpleSection,ConfigExample" allowDefinition="Everywhere" name="simple" /><section type="ConfigExample.Configuration.ComplexSection,ConfigExample" allowDefinition="Everywhere" name="complex"/></sectionGroup></configSections><sampleGroup><simple maxValue="20" minValue="1"></simple><complex height="190"><child firstName="James" lastName="Bond"/><children><add firstName="Zhao" lastName="yukai"/><add firstName="Lee" lastName="yukai"/><remove firstName="Zhao"/></children><NVs><add name="abc" value="123"/><add name="abcd" value="12d3"/></NVs></complex></sampleGroup>
</configuration>

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

public class SampleSectionGroup : System.Configuration.ConfigurationSectionGroup
{public SimpleSection Simple{get{return (SimpleSection)base.Sections["simple"];}}public ComplexSection Complex{get{return (ComplexSection)base.Sections["complex"];}}
}

在Web.config或App.config中的添加自定义配置相关推荐

  1. webconfig的解决方案怎么添加_解决在Web.config或App.config中添加自定义配置的方法详解...

    文档从网络中收集,已重新整理排版 .word 版本可编辑 . 欢迎下载支持 . 1 word 版本可编辑 . 欢迎下载支持 . 解决在 Web.config 或 App.config 中添 加自定义配 ...

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

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

  3. How to get Intellisense for Web.config and App.config in Visual Studio .NET?(转载)

    下载:http://files.cnblogs.com/wujm/clrconfig.rar How to install Download the CLRconfigSchema.zip file ...

  4. 在.NET中从app.config或web.config读取设置

    我正在使用一个C#类库,该类需要能够从web.config或app.config文件中读取设置(取决于DLL是从ASP.NET Web应用程序还是Windows Forms应用程序引用的). 我发现 ...

  5. C# 对WinForm应用程序的App.config的使用及加密

    原文地址:http://blog.163.com/zhou_zzq/blog/static/1019622120137621739874/ 我们在写C#应用程序时,在工程文件中放置一个app.conf ...

  6. 在部署 C#项目时转换 App.config 配置文件

    问题 部署项目时,常常需要根据不同的环境使用不同的配置文件.例如,在部署网站时可能希望禁用调试选项,并更改连接字符串以使其指向不同的数据库.在创建 Web 项目时,Visual Studio 自动生成 ...

  7. VisualStudio App.Config自动配置

    在VisualStudio中,可以跟据选定的运行模式自动生成相应的配置文件: 对web类型的项目,系统已自动有了Web.config.Web.Debug.config.Web.release.conf ...

  8. 读取并修改App.config文件(转载)

    1. 向项目添加app.config文件: 右击项目名称,选择"添加"→"添加新建项",在出现的"添加新项"对话框中,选择"添加应 ...

  9. App.Config详解

    App.Config详解 应用程序配置文件是标准的 XML 文件,XML 标记和属性是区分大小写的.它是可以按需要更改的,开发人员可以使用配置文件来更改设置,而不必重编译应用程序. 配置文件的根节点是 ...

最新文章

  1. python简单入门代码-Python入门 | IDLE的介绍和使用方法
  2. 【Android 界面效果9】9patch图片
  3. 前端每日实战:140# 视频演示如何用纯 CSS 创作文本的淡入动画效果
  4. 第一阶段_第三部分_光照与GI
  5. hdu 2709 递推
  6. Angular 动态控制 aside 标签显示和隐藏的一个例子
  7. python选择排序从大到小_Python实现选择排序
  8. SSH框架hibernate无法添加或修改,saveorupdate方法失效
  9. WampServer2.0的Apache的service无法启动的解决方法
  10. 中国双层超级电容器市场趋势报告、技术动态创新及市场预测
  11. 计算机上怎么带源地址ping,怎么带源地址去ping服务器
  12. 面试准备JSONP(一)
  13. Php的入栈,PHP实现的栈数据结构示例【入栈、出栈、遍历栈】
  14. 尚硅谷官网MySQL笔记
  15. 如何查看Tomcat版本信息
  16. 基于树莓派的语音机器人
  17. c语言课程设计报告 数独,C语言课程设计报告数独.pdf
  18. 2021年T电梯修理考试题及T电梯修理模拟考试题
  19. 淘宝数据可视化大屏案例(Hadoop实验)
  20. 升级安装win11 22H2(跳过TPM和CPU等检测)

热门文章

  1. UVa 10180 - Rope Crisis in Ropeland!
  2. WSDL、SOAP、UDDI
  3. 人生快乐之道(组图)
  4. OpenGL 矩阵变换
  5. spl_autoload_register与autoload区别
  6. ASP.NET 2.0数据处理之高级分页/排序
  7. JavaScript[对象.属性]集锦
  8. 锦上添花DataGrid!
  9. 一键安装python3环境
  10. posix_memalign