创建自定义配置节点(web.config和app.config都适用)
恼火!不小心点到全屏幕模式,刚写的东西全丢了!!从头再来!!!
无论是web程序、windows程序、windows service程序,配置文件都是少不了的。我们都习惯了将连接字符串放在ConnectionString节点中,将程序的设置放在appSetting节点中。配置文件的管理程序为我们提供了方便的管理方式,那么,我们如何自定义配置节点呢?
有两种方法,其一,继承IConfigurationSectionHandler,通过实现Create方法。这种方法的灵活度非常大,我们需要动手解析自定义节点的XmlNode,所以,实现起来也比较复杂。其二,继承ConfigurationSection,这种方法就简单多了,只需要指定对应的属性名称即可。
本文旨在使用最少的代码实现自定义配置节点,所以果断放弃第一种方法,使用第二种方法实现自定义配置节点。
光说不练假把式,接下来我们就着手使用第二种方法实现自定义配置节点。步骤如下:
1.在configSections节点中定义自定义配置节点信息
<configSections> <section name="custom" type="SampleWebConfigSection.Configuration.customSection, SampleWebConfigSection" /> </configSections>
name:自定义配置节点的名称
type:类型,自定义配置节点对应的数据类型
2.完成自定义配置节点的结构
<custom fileName="Default.txt" maxUsers="2500" maxIdleTime="00:10:00" /> 3.编程实现节点的访问
customSection代码
using System.Configuration;using System;namespace SampleWebConfigSection.Configuration{ public class customSection : ConfigurationSection { [ConfigurationProperty("fileName", DefaultValue = "default.txt", IsRequired = true, IsKey = false)] [StringValidator(InvalidCharacters = " ~!@#$%^&*()[]{}/;'\"|\\", MinLength = 1, MaxLength = 60)] public string FileName { get { return (string)this["fileName"]; } set { this["fileName"] = value; } } [ConfigurationProperty("maxUsers", DefaultValue = (long)10000, IsRequired = false)] [LongValidator(MinValue = 1, MaxValue = 10000000, ExcludeRange = false)] public long MaxUsers { get { return (long)this["maxUsers"]; } set { this["maxUsers"] = value; } } [ConfigurationProperty("maxIdleTime", DefaultValue = "0:10:0", IsRequired = false)] [TimeSpanValidator(MinValueString = "0:0:30", MaxValueString = "5:00:0", ExcludeRange = false)] public TimeSpan MaxIdleTime { get { return (TimeSpan)this["maxIdleTime"]; } set { this["maxIdleTime"] = value; } } }}ConfigurationProperty标记:指示 .NET Framework 通过custom节点的属性来实例化对象的字段值。对于每一个标记有此特性的属性,.NET Framework 都使用反射来读取修饰参数,并创建相关的 ConfigurationProperty 实例。
StringValidator标记:以声明的方式指示 .NET Framework 对配置属性执行字符串验证。
LongValidator标记:以声明的方式指示 .NET Framework 对配置属性执行长整型验证。
TimeSpanValidator标记:以声明的方式指示 .NET Framework 对配置属性执行时间验证。
4.自定义配置节点的使用
customSection custom = (customSection)System.Configuration.ConfigurationManager.GetSection("custom"); Response.Write(custom.FileName + "|" + custom.MaxUsers.ToString() + "|" + custom.MaxIdleTime); 在第一句代码中,我们通过ConfigurationManager.GetSection获取custom节点,并强制类型转换为我们自定义的节点,这样就能够方便的使用了。
OK,第一个例子完成。其实这个例子是MSDN中的,我将它拿下来,稍加说明而已。
当然,只有上面这些内容是不足以放首页的。上面的例子并不能完全满足我们常规的需求,甚至我们可以把这些配置放在appSetting中来替代我们的自定义配置节点。下面介绍一个实际的需求:
在网站的建设中,我们希望将网站的标题、副标题和网址放在一条配置中,因为网站有文件上传功能,我们希望在配置中限制上传文件的大小,并针对不同的上传类型将文件放在不同的目录中。定以后的节点结构如下:
<webSetting> <base title="草屋&拾荒" subTitle="七千米深蓝的博客" url="http://youring2.cnblogs.com"></base> <fileUpload> <file name="headPhoto" path="upload/image/headPhoto" size="200"></file> <file name="album" path="upload/image/album" size="1024"></file> </fileUpload> </webSetting> 要完成这个自定义配置节点,按照第一个例子的步骤,我们需要现在configSections中配置自定义节点信息:
<section name="webSetting" type="SampleWebConfigSection.Configuration.webSettingSection, SampleWebConfigSection" /> 不解释,接下来我们需要完成四个类:
webSettingSection
baseSection
fileUploadSection
fileSection
这四个类分别对应这个配置中的四个节点:webSetting、base、fileUpload和file。
webSettingSection 代码
using System.Configuration;namespace SampleWebConfigSection.Configuration { public class webSettingSection : ConfigurationSection { //base节点 [ConfigurationProperty("base")] public baseSection BaseSetting { get {return (baseSection)base["base"]; } } //fileUpload节点 [ConfigurationProperty("fileUpload")] public fileUploadSection FileUploadSetting { get { return (fileUploadSection)base["fileUpload"]; } } }} 派生自ConfigurationSection,包含两个属性:BaseSetting和FileUploadSetting,这两个属性分别对应配置文件中的两个子节点base 和fileUpload。
baseSection 代码
using System.Configuration;namespace SampleWebConfigSection.Configuration{ public class baseSection : ConfigurationElement { //title属性 [ConfigurationProperty("title", IsKey = true, IsRequired = true)] public string title { get { return (string)base["title"]; } set { title = value; } } //subTitle属性 [ConfigurationProperty("subTitle", IsRequired = false, DefaultValue="")] public string subTitle { get { return (string)base["subTitle"]; } set { subTitle = value; } } //url属性 [ConfigurationProperty("url", IsRequired = true)] public s
补充:Web开发 , ASP.Net ,