• 在Web.config配置文件中自定义配置节点


    摘要:

        大部分ASP.NET应用程序都包含很多个配置信息,比较常见的有连接字符串配置ConnectionString;当我们需要用到Login控件自动发送Email时,我们就要配置Email服务器节点;还有很多如Page节点可以引入程序集和命名空间等等。根据我的经验很多网站的初始化信息(默认设置)很多都会保存在数据库中,也有很多保存在配置文件中,他们各有各的优点。我们可以在web.config中定义我们自己的节点,然后再读取或更新自定义配置文件,当然我们也可以自定义一个配置文件并将其解析读取。本文主要讲的是利用ASP.NET给我提供的一些APIs在Web.config中自定义配置节点。

         为了能够更好的说明,我们先定义一个配置节点<NExplus/>,它有一个属性网站名称webName。有自己的Providers,以及一个States节点,配置如下:

     1 <NExplus webName="Custom configuration section in web.config">
     2         <providers>
     3             <add name="CommonProvider" type="NExplus.Data.SqlCommonProvider,NExplus.Data" connectionStringName="SqlServer"/>
     4         </providers>
     5         <states>
     6             <add name="厦门" code="0592"/>
     7             <add name="福州" code="0591"/>
     8             <add name="三明" code="0598"/>
     9         </states>
    10 </NExplus>
    11 

    读取方法:

        配置文件中就是XML文件,如果是我们自定义地配置文件可以用DotNet读取XML的方法通过序列化和反序列化等来读取,在以后的版本中还可以通过XLinQ来读取。而在web.config文件中主要可以通过两种方法来读取配置文件,当然首先要做的是在<configSections>节点中配置关联的操作类及其程序集

    <!--[if !supportLists]-->    1.定义一个类,实现System.Configuration.IConfigurationSectionHandler接口,这个方法很简单就是实现一个方法,这里就不再多说了。

    <!--[if !supportLists]-->    2.在ASP.NET2.0中我们已经能够很简单的操作配置文件中的节点了,他为我们提供了一系列的类如我们定义一个类只要继承ConfigurationSection就可以定义我们的节点了,子节点可以继承ConfigurationElement等等。只要在属性上标注ConfigurationProperty attribute即可。

    定义配置类:
     1 public class CustomConfiguration : ConfigurationSection
     2 {
     3    [ConfigurationProperty("webName", DefaultValue="Custom configuration section in web.config ", IsRequired=false)]
     4    public string WebName
     5    {
     6       get
     7       {
     8          return this["webName"as string;
     9       }
    10    }
    11 }
    12 

       以上只列出了读取属性的方法,每一个用ConfigurationProperty attribute标注的属性就能够自动从web.config文件中反序列过来实例化当前类。下面我们来看看ConfigurationProperty attribute的每一个属性的作用。

    <!--[if !supportLists]-->    <!--[endif]-->Name:配置节点名称或属性名称,要求唯一标识。

    <!--[if !supportLists]-->    <!--[endif]-->DefaultValue:配置文件中每个属性的默认值,如果配置文件中没有定义此属性则在代码中调用此属性时,将取得这个值。

    <!--[if !supportLists]-->    <!--[endif]-->IsRequired:标明当前属性是否必须,如果为true而配置文件中并没有定义此属性,当访问此网站时将抛出错误。

       我们可以通过System.Web.Configuration.WebConfigurationManager来获取此节点的实例,代码如下:

    1 public static CumstomConfiguration GetConfig(){
    2    return WebConfigurationManager.GetSection(“NExplus”) as CumstomConfiguration;
    3 }
    4 

    基于集合配置属性的读取:

        很多时候我们需要得到一个集合的所有配置,最常见的莫过于providers,系统已经为我们准备好了ProviderCollection,我们只要直接引用就好了。但是如果遇到向上面定义的<states>节点的读取就需要我们自己来写一个集合,这个集合要继承ConfigurationElementCollection类,而当前实体类需继承ConfigurationElement类。为了读取<states>节点我们定义一个实体类如下:

     1 public class ConfigurationState : ConfigurationElement
     2 {
     3    [ConfigurationProperty("name", IsRequired=true)]
     4    public string Name
     5    {
     6       get
     7       {
     8          return this["name"as string;
     9       }
    10    }
    11 
    12    [ConfigurationProperty("code", IsRequired=false)]
    13     public string Code
    14    {
    15       get
    16       {
    17          return this["code"as string;
    18       }
    19    }
    20 }
    21 

       有了实体类我们当然要写一个集合类,代码如下:

     1 public class ConfigurationStateCollection : ConfigurationElementCollection
     2 {
     3    public ConfigurationState this[int index]
     4    {
     5       get
     6       {
     7          return base.BaseGet(index) as ConfigurationState;
     8       }
     9       set
    10       {
    11          if (base.BaseGet(index) != null)
    12          {
    13             base.BaseRemoveAt(index);
    14          }
    15          this.BaseAdd(index, value);
    16       }
    17    }
    18 
    19    protected override ConfigurationElement CreateNewElement()
    20    {
    21       return new ConfigurationState();
    22    }
    23 
    24    protected override object GetElementKey(ConfigurationElement element)
    25    {
    26       return ((ConfigurationState)element).Name;
    27    } 
    28 }
    29 

          我们需要对当前集合进行索引读取或设置,重写了两个方法,从而能够获取当前实例和获取当前配置节点的名称等,当然最后一步就是要将它加入到配置类中(次配置类一定要在configSettings节点中标注)。代码如下:

     1 public class CustomConfiguration : ConfigurationSection
     2 {
     3     
     4 
     5    [ConfigurationProperty("states")]
     6    public ConfigurationStateCollection CustomStates
     7    {
     8       get 
     9       { 
    10          return this["states"as ConfigurationStateCollection; 
    11       }
    12    }
    13 }
    14 

    总结:

        这篇文章已经不是什么新鲜的事了,由于最近我也在做这个事情,其中值得说明的是在providers的应用,我们可以通过ProvidersCollection来读取其集合,通过ProvidersHelper来实例化当前provider,如果在你的数据库提供者抽象类中继承ProviderBase类万事就OK了。如果考虑到性能问题可以借助Cache来提高一些性能,最后还是希望能给更多人带来一点帮助,分享一下我的经验。

  • 相关阅读:
    [转]了解ASP.NET MVC几种ActionResult的本质:EmptyResult & ContentResult
    [转]XPath 语法
    [转]XSL 语言
    [转]项目经理面试指南
    [转]《精通css》笔记1:css选择器与优先级
    [转]jQuery 简介
    [转]Android 70道面试题
    [书目20130316].NET应用架构设计:原则、模式与实践
    [转]XPath语法 在C#中使用XPath示例
    [转]Android面试3
  • 原文地址:https://www.cnblogs.com/ly5201314/p/1572578.html
Copyright © 2020-2023  润新知