在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>节点中配置关联的操作类及其程序集

    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>节点的读取就需要我们自己来写一个集合,这个集合要继承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来提高一些性能,最后还是希望能给更多人带来一点帮助,分享一下我的经验。                                                                                本文转自网魂小兵博客园博客,原文链接:http://www.cnblogs.com/xdotnet/archive/2007/05/07/aspnet_custom_configurationsection.html,如需转载请自行联系原作者

相关文章
|
2月前
|
Java API 数据库
构建RESTful API已经成为现代Web开发的标准做法之一。Spring Boot框架因其简洁的配置、快速的启动特性及丰富的功能集而备受开发者青睐。
【10月更文挑战第11天】本文介绍如何使用Spring Boot构建在线图书管理系统的RESTful API。通过创建Spring Boot项目,定义`Book`实体类、`BookRepository`接口和`BookService`服务类,最后实现`BookController`控制器来处理HTTP请求,展示了从基础环境搭建到API测试的完整过程。
60 4
|
1月前
|
JavaScript 前端开发 开发工具
web项目规范配置(husky、eslint、lint-staged、commit)
通过上述配置,可以确保在Web项目开发过程中自动进行代码质量检查和规范化提交。Husky、ESLint、lint-staged和Commitlint共同作用,使得每次提交代码之前都会自动检查代码风格和语法问题,防止不符合规范的代码进入代码库。这不仅提高了代码质量,还保证了团队协作中的一致性。希望这些配置指南能帮助你建立高效的开发流程。
48 5
|
2月前
|
JavaScript
webpack学习五:webpack的配置文件webpack.config.js分离,分离成开发环境配置文件和生产环境配置文件
这篇文章介绍了如何将webpack的配置文件分离成开发环境和生产环境的配置文件,以提高打包效率。
58 1
webpack学习五:webpack的配置文件webpack.config.js分离,分离成开发环境配置文件和生产环境配置文件
|
2月前
|
JavaScript 前端开发 应用服务中间件
vue前端开发中,通过vue.config.js配置和nginx配置,实现多个入口文件的实现方法
vue前端开发中,通过vue.config.js配置和nginx配置,实现多个入口文件的实现方法
201 0
|
2月前
|
监控 Java Maven
springboot学习二:springboot 初创建 web 项目、修改banner、热部署插件、切换运行环境、springboot参数配置,打包项目并测试成功
这篇文章介绍了如何快速创建Spring Boot项目,包括项目的初始化、结构、打包部署、修改启动Banner、热部署、环境切换和参数配置等基础操作。
164 0
|
2月前
|
NoSQL Java 数据库连接
springBoot:整合其他框架&condition&切换web配置 (五)
本文档介绍了如何在Spring Boot项目中整合JUnit、Redis和MyBatis等框架,并提供了相应的依赖配置示例。同时,还展示了如何通过条件注解实现Bean的条件创建,以及如何切换Web服务器配置,从默认的Tomcat切换到Jetty。
|
3月前
|
算法 安全 Java
微服务(四)-config配置中心的配置加解密
微服务(四)-config配置中心的配置加解密
|
4月前
|
移动开发 JavaScript 前端开发
UniApp H5 跨域代理配置并使用(配置manifest.json、vue.config.js)
这篇文章介绍了在UniApp H5项目中处理跨域问题的两种方法:通过修改manifest.json文件配置h5设置,或在项目根目录创建vue.config.js文件进行代理配置,并提供了具体的配置代码示例。
UniApp H5 跨域代理配置并使用(配置manifest.json、vue.config.js)
|
3月前
|
JavaScript
Vue3基础(19)___vite.config.js中配置路径别名
本文介绍了如何在Vue 3的Vite配置文件`vite.config.js`中设置路径别名,以及如何在页面中使用这些别名导入模块。
147 0
Vue3基础(19)___vite.config.js中配置路径别名
|
2月前
|
前端开发 JavaScript
vite vue3 config配置
【10月更文挑战第5天】
101 0