【IT168技术】引言
.NET的美妙特点之一是它的XML配置功能。在.NET 1.x时代,常见的应用程设置、数据库连接字符串、ASP.NET Web服务器配置和基本的自定义配置数据可以存储在.config文件中。自定义配置节可以使用一些基本自定义结构,允许少数几种信息存储在.config文件中。然而更复杂的配置,最常见的实现是自定义XML结构和自定义解析代码。尽管有多种不同性能的方法完成同样的事情,这种代码将变得相当复杂。
随着.NET 2.0,自己编写(可能很复杂、低性能、繁琐)代码来管理自定义XML配置结构的时代已经结束了。.NET 2.0内置的XML配置子系统自定义配置能力已经大大革新,拥有一些非常有用的和节省时间的功能。几乎任何XML配置结构你可能需要相对更少的工作且更容易。此外,反序列化.config中的XML总是可以重载的。这使得任何XML结构可以不失去.NET 2.0配置支持的其它高级功能。
该系列
这是该系列的第一篇文章。开始使用.NET 2.0所要求的所有核心概念和知识点都在这第一篇文章中提供。但是,.NET 2.0可用的配置框架是广泛的。从本文可以看到,它有许多功能和一些隐藏功能,可以填补框架的空白和疏漏。要继续学习有关.NET 2.0的配置框架,其它文章可以在以下链接找到:
揭开.NET 2.0配置之谜
解码.NET 2.0配置之谜
破解.NET 2.0配置之谜
写此系列的缘由(The mystery)
在略微超过一年的时间里我一直在使用.NET 2.0,可悲的是,我花了许多不眠之夜去修修补补自定义配置模型。自定义XML配置处理不断持续的性能下降,每个应用程序需要一个新的模型,这依赖于配置是如何存储的以及如何需要访问(从哪里)。直到8个月前左右,我用Reflector凿开.NET 2.0框架的一些程序集,我遇到一个奇妙的小类:System.Configuration.ConfigurationSection。挖掘更深一点,我发现为数众多的框架类都继承自ConfigurationSection和一些其它的类。自那时起,我花了几个不眠之夜吸收尽可能多的.NET 2.0的新配置特性。
我只想说,在互联网上关于自定义配置节的真正能力的资料非常少。通过Internet搜索、数小时的用Reflector研究框架代码、持续的实验和用自定义配置节,我终于知道了我需要知道的。这是生命的救星。最终,能轻松容易地创建和管理自定义XML配置、简单易用、易于管理并且性能优越……我将在与大家分享这个圣杯。我要求的唯一回报就是让任何人和你认识的用.config文件的人——他们应该更好地写.NET代码,看到这篇文章从而节省通过数个月的挖掘代码、互联网论坛和博客来学习它。
有关配置的主题
本文的目标是覆盖所有的.NET 2.0的配置,以及揭露一些更严密保护的秘密(标注:无正式文档的,无事实证明的…种种原因),可以节省你大量的时间和麻烦。首先,我们总览核心命名空间,它揭露了所有的自定义配置疯狂之处。然后,我们将进入具体执行和使用自定义配置。讨论的议题如下:
命名空间:System.Configuration
对象模型配置概念
编写一个基本的配置节
使用自定义配置节
添加自定义元素
添加元素集合
高级元素集合
自定义配置节组
保存配置更改
配置技巧和窍门
高级配置主题
附录
1.附录A:配置结构的级联
2.附录B:包含外部配置文件
1、命名空间:System.Configuration
新的.NET 2.0的配置精华核心是System.Configuration命名空间。默认情况下,当引用了System.dll程序集,此命名空间是可用的。它包括.NET 1.1的所有功能,包括旧的ConfigurationSettings类(现在.NET 2.0不推荐使用了)。然而,为了获得.NET 2.0的新特性,你必须添加对System.Configuration.dll程序集的引用。在这个程序集里你会发现新的配置系统的核心,ConfigurationManager静态类。
ConfigurationManager类是一个全局的访问一个应用程序的配置的入口。由于类是静态的,其所有的成员也是静态的。这使得读取如AppSettings,ConnectionStrings和自定义配置节轻而易举。虽然这类似于ConfigurationSettings类它也提供一些能够更加安全地访问应用程序的配置的新功能。这些新功能,也可以允许将配置设置保存到任何配置节:自定义或其他的。
除了ConfigurationManager类是自定义配置节的生命线。下面列出的基类可以帮助你编写自己的配置对象模型。还将有更多关于这方面的。除了一个基类集是一个校验集,可以用来确保你的自定义配置节的准确性。此外,如果你的需要很简单,只需要用一些预制的配置。
基本类型
ConfigurationSection - 配置节基类
ConfigurationSectionCollection - 配置节集合的基类
ConfigurationSectionGroup - 配置节组的基类
ConfigurationSectionGroupCollection - 配置节组集合的基类
ConfigurationElement - 配置元素的基类
ConfigurationElementCollection - 配置元素集合的基类
ConfigurationConverterBase - 自定义转换器基类*1
ConfigurationValidatorBase - 自定义验证器基类*2
支持类型
ConfigurationManager - 提供对客户端应用程序配置文件的访问
Configuration - 表示一个应用程序的配置
ConfigurationProperty - 表示属性或配置元素的子元素
ConfigurationPropertyAttribute - 以声明方式指示.NET Framework,以实例化配置属性
ConfigurationPropertyCollection - 配置属性的集合
ConfigurationPropertyOptions - 指定要应用于属性的选项
验证类型
CallbackValidator - 提供对对象的动态验证
CallbackValidatorAttribute - 指定用于代码验证的CallbackValidator对象
IntegerValidator - 对Int32值进行验证
IntegerValidatorAttribute - 以声明的方式指示.NET Framework对配置属性执行整数验证
LongValidator - 对Int64值进行验证。
LongValidatorAttribute - 以声明的方式指示.NET Framework对配置属性执行长整型验证
PositiveTimeSpanValidator - 对TimeSpan对象进行验证。
PositiveTimeSpanValidatorAttribute - 以声明的方式指示.NET Framework对配置属性执行时间验证
RegexStringValidator - 根据正则表达式提供的规则提供字符串验证
RegexStringValidatorAttribute - 以声明方式指示.NET Framework使用正则表达式在配置属性中执行字符串验证
StringValidator - 对字符串进行验证
StringValidatorAttribute - 以声明的方式指示.NET Framework对配置属性执行字符串验证
SubclassTypeValidator - 验证一个对象是否是指定类型的派生类*3
SubclassTypeValidatorAttribute - 以声明方式指示.NET Framework对配置属性执行验证
TimeSpanValidator - 对TimeSpan对象进行验证
TimeSpanValidatorAttribute - 以声明的方式指示.NET Framework对配置属性执行时间验证