在Web.config配置文件中自定义配置节点(转载)

摘要:

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

     为了能够更好的说明,我们先定义一个配置节点<nexplus></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></configsections>节点中配置关联的操作类及其程序集

1.定义一个类,实现System.Configuration.IConfigurationSectionHandler接口,这个方法很简单就是实现一个方法,这里就不再多说了。

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的每一个属性的作用。

--Name:配置节点名称或属性名称,要求唯一标识。

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

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

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

 

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

 

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

    很多时候我们需要得到一个集合的所有配置,最常见的莫过于providers,系统已经为我们准备好了ProviderCollection,我们只要直接引用就好了。但是如果遇到向上面定义的<states></states>节点的读取就需要我们自己来写一个集合,这个集合要继承ConfigurationElementCollection类,而当前实体类需继承ConfigurationElement类。为了读取<states></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来提高一些性能,最后还是希望能给更多人带来一点帮助,分享一下我的经验。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值