`
isiqi
  • 浏览: 16057646 次
  • 性别: Icon_minigender_1
  • 来自: 济南
社区版块
存档分类
最新评论

革新:.NET 2.0的自定义配置文件体系初探

阅读更多
以前在1.1.的时代我们为了写一个自定义配置,需要实现System.Configuration.IConfigurationSectionHandler接口,然后用System.Configuration.ConfigurationSettings.AppSettings.Get()方法去获取配置内容。在实现System.Configuration.IConfigurationSectionHandler的过程中会进行大量繁琐的XML节操作,如果希望Get()方法返回一个强类型的配置实体对象,还需要写一个相应的类。这些工作枯燥而且工作量很大,特别是在一个配置很复杂的时候。
并且,1.1中的配置文件对于程序来说是只读的,若配置文件一旦发生改变怎会引发应用程序重启。

而现在,2.0提供了全新的自定义配置文件构建方式,支持强类型的配置属性,并提供了代码对配置文件进行动态修改的机制。我对其作了一些初步的研究,在这里抛砖引玉了。


  1. 首先我们来看看最简单的情况如何处理:

    <?xmlversion="1.0"encoding="utf-8"?>
    <configuration>
    <configSections>
    <sectionname="RemotingCompress"type="Xrinehart.Framework.CommSupport.Section.RemotingCompressSection,ConfigManagement"
    allowDefinition
    ="Everywhere"allowExeDefinition="MachineToApplication"restartOnExternalChanges="true"/>
    </configSections>
    <RemotingCompressCompressLevel="DEFAULT_COMPRESSION"CompressCacheSize="1024"UnCompressCacheSize="1024"MinCompressSize="0">
    </configuration>

    只有一个配置节:RemotingCompress,拥有4个属性CompressLevel、CompressCacheSize、UnCompressCacheSize、MinCompressSize。

    我们需要实现一个从System.Configuration.ConfigurationSection基类继承的配置类,在2.0里配置信息实体和配置识别都在一个类中,我们先来看代码:
    usingSystem;
    usingSystem.Collections.Generic;
    usingSystem.Text;
    usingSystem.Configuration;

    namespaceXrinehart.Framework.CommSupport.Section
    {
    /**////<summary>
    ///压缩率级别的枚举
    ///</summary>

    publicenumDeflater
    {
    /**////<summary>
    ///最佳压缩效果,速度慢
    ///</summary>

    BEST_COMPRESSION=9,
    /**////<summary>
    ///默认压缩率,压缩速度比最高(推荐)
    ///</summary>

    DEFAULT_COMPRESSION=-1,
    /**////<summary>
    ///强化压缩率,速度较慢
    ///</summary>

    DEFLATED=8,
    /**////<summary>
    ///最佳速度压缩率,速度最快(宽带推荐)
    ///</summary>

    BEST_SPEED=1,
    /**////<summary>
    ///不压缩
    ///</summary>

    NO_COMPRESSION=0
    }
    ;

    /**////<summary>
    ///RemotingCompress配置节类
    ///</summary>

    publicsealedclassRemotingCompressSection:System.Configuration.ConfigurationSection
    {
    //该配置文件只读
    privatestaticbool_ReadOnly=true;

    publicRemotingCompressSection()
    {
    }


    privatenewboolIsReadOnly
    {
    get
    {
    return_ReadOnly;
    }

    }


    privatevoidThrowIfReadOnly(stringpropertyName)
    {
    if(IsReadOnly)
    thrownewConfigurationErrorsException(
    "Theproperty"+propertyName+"isreadonly.");
    }


    protectedoverrideobjectGetRuntimeObject()
    {
    //Toenablepropertysettingjustassigntrueto
    //thefollowingflag.
    _ReadOnly=true;
    returnbase.GetRuntimeObject();
    }


    所有配置属性#region所有配置属性

    /**////<summary>
    ///配置节属性:压缩率级别(可选)
    ///</summary>

    [ConfigurationProperty("CompressLevel",DefaultValue="DEFAULT_COMPRESSION",Options=ConfigurationPropertyOptions.None)]
    publicDeflaterCompressLevel
    {
    get
    {
    return(Deflater)this["CompressLevel"];
    }

    set
    {
    ThrowIfReadOnly(
    "CompressLevel");
    this["compressLevel"]=value;
    }

    }


    /**////<summary>
    ///配置节属性:压缩时缓冲区大小(可选)
    ///</summary>

    [ConfigurationProperty("CompressCacheSize",DefaultValue=(Int32)40960,Options=ConfigurationPropertyOptions.None)]
    [IntegerValidator(MinValue
    =1024,MaxValue=1024*1024,ExcludeRange=false)]
    publicintCompressCacheSize
    {
    get
    {
    return(Int32)this["CompressCacheSize"];
    }

    set
    {
    ThrowIfReadOnly(
    "CompressCacheSize");
    this["CompressCacheSize"]=value;
    }

    }


    /**////<summary>
    ///配置节属性:解压时缓冲区大小(可选)
    ///</summary>

    [ConfigurationProperty("UnCompressCacheSize",DefaultValue=(Int32)40960,Options=ConfigurationPropertyOptions.None)]
    [IntegerValidator(MinValue
    =1024,MaxValue=1024*1024,ExcludeRange=false)]
    publicintUnCompressCacheSize
    {
    get
    {
    return(Int32)this["UnCompressCacheSize"];
    }

    set
    {
    ThrowIfReadOnly(
    "UnCompressCacheSize");
    this["UnCompressCacheSize"]=value;
    }

    }


    /**////<summary>
    ///配置节属性:超过该值后的流才会被压缩(可选),暂未实现
    ///</summary>

    [ConfigurationProperty("MinCompressSize",DefaultValue=(Int32)40960,Options=ConfigurationPropertyOptions.None)]
    [IntegerValidator(MinValue
    =0,MaxValue=Int32.MaxValue,ExcludeRange=false)]
    publicintMinCompressSize
    {
    get
    {
    return(Int32)this["MinCompressSize"];
    }

    set
    {
    ThrowIfReadOnly(
    "MinCompressSize");
    this["MinCompressSize"]=value;
    }

    }

    #endregion

    }

    }



    上面的代码中可以看到核心代码是ConfigurationPropertyAttribute属性,在一个类属性上插入一个ConfigurationPropertyAttribute即可完成对配置文件中一个节点的属性的申明。

    比如CompressLevel这个属性的定义:
    /**////<summary>
    ///配置节属性:压缩率级别(可选)
    ///</summary>

    [ConfigurationProperty("CompressLevel",DefaultValue="DEFAULT_COMPRESSION",Options=ConfigurationPropertyOptions.None)]
    publicDeflaterCompressLevel
    {
    get
    {
    return(Deflater)this["CompressLevel"];
    }

    set
    {
    ThrowIfReadOnly(
    "CompressLevel");
    this["compressLevel"]=value;
    }

    }
    首先,ConfigurationProperty的第一个参数"CompressLevel"这个是在XML配置文件中属性的名字,注意它是大小写敏感的。而DefaultValue则是设置该属性的默认值,Options设置有4种,分别是None, IsKey, IsRequired, IsDefaultCollection.这四项也可以单独在属性里分别设置。
    若选择了None,则该属性可以在配置文件中不体现,而系统会去取得设置的默认值(如果有设置的话);若选择了IsRequired而在配置文件中没有体现,则会引发异常。另外,若所有一个配置节的所有属性都不是必须的,在配置文件中即便没有这个配置节,依然可以在系统中得到该配置节的默认值信息。

    请注意该属性是个枚举类型,而在属性中对类型进行转换,即可方便的实现,并不需要做其他更多的处理。

    你也许注意到在代码中的一些属性有[IntegerValidator(MinValue = 0, MaxValue = Int32.MaxValue, ExcludeRange = false)]这样的代码.是的,类库中提供了IntegerValidatorAttribute、LongValidatorAttribute、RegexStringValidatorAttribute、StringValidatorAttribute、TimeSpanValidatorAttribute默认的数据校验类,可以对XML中的该属性进行规范限制,并且你可以自己实现从ConfigurationValidatorAttribute基类继承的自定义校验类,完成一些自己设定的校验,比如对上述的枚举类型值的限制。


    接下来,我们看看如何访问到该配置节的。
    首先在配置文件中添加识别节点的信息,参见上面。然后我们需要用到System.Configuration.ConfigurationManager.OpenMappedExeConfiguration()方法。
    System.Configuration.Configurationconfig=ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);

    RemotingCompressSectionsection
    =config.Sections["RemotingCompress"]asRemotingCompressSection;
    OpenMappedExeConfiguration()有两种重载,我只尝试成功了上述这种,另外一种说是可以从指定配置文件中得到配置对象,但我没成功过,谁要是搞明白了,记得告诉我下。

    只需上面两行就可以做到,当然还可以更简单RemotingCompressSectionsection = ConfigurationManager.GetSection("RemotingCompress") as RemotingCompressSection。而我写上面这种写法是为了可以在运行时对配置文件内容进行修改。

    另外,若配置文件有配置节点组,即
    <?xmlversion="1.0"encoding="utf-8"?>
    <configuration>
    <configSections>
    <sectionGroupname="XrinehartFramework">
    <sectionGroupname="CommSupport">
    <sectionname="RemotingCompress"type="Xrinehart.Framework.CommSupport.Section.RemotingCompressSection,ConfigManagement"
    allowDefinition
    ="Everywhere"allowExeDefinition="MachineToApplication"restartOnExternalChanges="true"/>
    </sectionGroup>
    </sectionGroup>
    </configSections>
    <XrinehartFramework>
    <CommSupport>
    <RemotingCompressCompressLevel="DEFAULT_COMPRESSION"CompressCacheSize="1024"UnCompressCacheSize="1024"MinCompressSize="0">
    </RemotingCompress>
    </CommSupport>
    </XrinehartFramework>
    </configuration>
    你也只需要相应的改变下获取的代码,而不用去改变配置类
    config.SectionGroups["XrinehartFramework"].SectionGroups["CommSupport"].Sections["RemotingCompress"]
  2. 我们再来看看如何在代码中对配置节的内容进行修改:
    section.CompressLevel=Deflater.BEST_SPEED;
    config.Save();

    即在对配置对象的属性进行修改之后,用配置文件对象的save方法。你还可以用SaveAs方法存为别的文件。
  3. 这次就先讲那么多,下次再继续介绍更复杂的配置文件的处理方式,比如节点下有子节点的情况。如果你有什么发现也请告诉我。
另外刚发现编不错的文章。http://blog.csdn.net/mixiaobo/archive/2005/11/18/532386.aspx
分享到:
评论

相关推荐

    ASP.NET 2.0 动态网站开发教程.rar

    ASP.NET 2.0是微软公司推出的新一代企业级开发平台,它不是ASP.NET 1.1版本的简单升级,而是对原有版本的全面革新。ASP.NET 2.0不仅功能强大,而且易学易用。利用它能够在最短的时间内开发具有出高效性、高可靠性和...

    ASP.NET 2.0 动态网站开发教程0

    ASP.NET 2.0是微软公司推出的新一代企业级开发平台,它不是ASP.NET 1.1版本的简单升级,而是对原有版本的全面革新。ASP.NET 2.0不仅功能强大,而且易学易用。利用它能够在最短的时间内开发具有出高效性、高可靠性和...

    ASP[1].NET+2.0动态网站开发教程

    ASP.NET 2.0是微软公司推出的新一代企业级开发平台,它不是ASP.NET 1.1版本的简单升级,而是对原有版本的全面革新。ASP.NET 2.0不仅功能强大,而且易学易用。利用它能够在最短的时间内开发具有出高效性、高...

    ASP.NET 2.0动态网站开发教程-3

    2006年09月 &lt;br&gt;作者:程不功,龙跃进,卓琳 主编 &lt;br&gt;出版社:清华大学出版社 &lt;br&gt;ASP.NET 2.0是微软公司推出的新一代企业级开发平台,它不是ASP.NET 1.1版本的简单升级,而是对原有版本的全面革新。...

    ASP.NET 2.0动态网站开发教程-2

    第一部分介绍ASP.NET 2.0的基础知识,包括.NET框架的体系结构、ASPX网页的运行机制、验证控件的使用以及相关的浏览器技术。第二部分介绍了数据访问技术,包括ADO.NET的系统结构,对数据库的连接、显示、编辑与同步,...

    ASP.NET 2.0动态网站开发教程-1

    第一部分介绍ASP.NET 2.0的基础知识,包括.NET框架的体系结构、ASPX网页的运行机制、验证控件的使用以及相关的浏览器技术。第二部分介绍了数据访问技术,包括ADO.NET的系统结构,对数据库的连接、显示、编辑与同步,...

    ASP.NET 2.0动态网站开发教程-4

    2006年09月 &lt;br&gt;作者:程不功,龙跃进,卓琳 主编 &lt;br&gt;出版社:清华大学出版社 &lt;br&gt;ASP.NET 2.0是微软公司推出的新一代企业级开发平台,它不是ASP.NET 1.1版本的简单升级,而是对原有版本的全面革新。...

    ASP.NET 2.0动态网站开发教程-6

    程不功,龙跃进,卓琳 主编 &lt;br&gt;出版社:清华大学出版社 &lt;br&gt;内容提要 ASP.NET 2.0是微软公司推出的新一代企业级开发平台,它不是ASP.NET 1.1版本的简单升级,而是对原有版本的全面革新。ASP.NET 2.0不仅...

    asp.net 2.0动态网站开发教程

    asp.net2.0是微软推出的新一代企业级开发平台,它不是asp.net1.1的简单升级,而是对原有版本的全面革新。

    asp.net知识库

    革新:.NET 2.0的自定义配置文件体系初探 关于如何在ASP.NET 2.0中定制Expression Builders 怎么在ASP.NET 2.0中使用Membership asp.net 2.0-实现数据访问(1) ASP.NET 2.0 新特性 .NET 2.0里使用强类型数据创建...

    IBM:数字化革新:工业4.0.zip

    IBM:数字化革新:工业4.0.zip

    政务服务”革新:从理念认同到技术规范.doc

    政务服务”革新:从理念认同到技术规范.doc

    技术革新:现代交易员的一些最好的指标.doc.pdf

    技术革新:现代交易员的一些最好的指标.doc

    行业简报:中国数字经济革新:数字人民币展望(2022)(18页).pdf

    行业简报:中国数字经济革新:数字人民币展望(2022)(18页).pdf

    基于网络安全等级保护2.0新安全体系实践.zip

    从等级保护2.0的变化看网络安全革新 关注整体网络空间体系安全 关键信息基础设施单位,需要以新的视角考虑安全体系 可信体系在等级保护2.0中的关键作用 构建与新信息化设施深度融合的等级保护安全体系 结合等保2.0...

    Foxzu CMS 系统(简称FoxzuCMS 系统)

    FoxzuCMS内容管理系统,是国内CMS市场的新秀、也是国内少有的采用微软的ASP.NET 2.0 + SQL2000/2005 技术框架开发的CMS,充分利用ASP.NET架构的优势,突破传统ASP类CMS的局限性,采用更稳定执行速度更高效的面向对象...

    QwxCMS建站工具

    QwxCMS青乌序内容管理系统,是国内CMS市场的新秀、也是国内少有的采用微软的ASP.NET 2.0 + SQL2000/2005 技术框架开发的CMS,充分利用ASP.NET架构的优势,突破传统ASP类CMS的局限性,采用更稳定执行速度更高效的面向...

    .NET Windows编程系列课程(23):DataSet高级使用

    在ADO.NET中,一个非常重要的技术就是数据集,在前面的讲座中,大家已经对数据集有了一个比较全面的认识。在本次讲座中,我们将深入探讨Dataset的一些特性,包括ADO.NET2.0中数据集的一些革新。

    iHuzu ECWS 狐族企业建站系统 v1.0 beta3

    iHuzuCMS狐族内容管理系统,是国内CMS市场的新秀、也是国内少有的采用微软的ASP.NET 2.0 + SQL2000/2005 技术框架开发的CMS,充分利用ASP.NET架构的优势,突破传统ASP类CMS的局限性,采用更稳定执行速度更高效的面向...

    HTML 5的革新:结构之美

    本文从页面的doctype说起,到用HTML 5新标签搭建语义化更明确的页面的结构,再解释了一番与页面结构相关的新标签。相信大家对HTML 5的结构性新标签有了一个... ...HTML 5如同一场革命,正在Web2.0后时代轰轰烈烈的进行着。

Global site tag (gtag.js) - Google Analytics