当前位置:编程学习 > asp >>

创建自定义配置节点(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 ,
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,