热门标签 | HotTags
当前位置:  开发笔记 > 数据库 > 正文

在web.config和app.config文件中增加自定义配置节点的方法

本篇文章主要是对在web.config和app.config文件中增加自定义配置节点的方法进行了详细的介绍,需要的朋友可以过来参考下,希望对大家有所帮助

有经验的开发人员都知道在开发.NET应用时可以利用配置文件保存一些常用并且有可能变化的信息,例如日志文件的保存路径、数据库连接信息等等,这样即使生产环境中的参数信息与开发环境不一致也只需要更改配置文件而不用改动源代码再重新编译,极其方便。并且我们一般还约定,在节点保存应用程序的配置信息,在中保存数据库连接字符串信息。

上面的这些方法和约定足以让我们在大部分开发中获得方便,但是在有些情况下有些配置信息可以按组分类存放,如果采用上面的方法不仅不直观,而且读取起来也不是太方便,幸好在.NET里就提供了这样的方法。如果有使用过Log4Net或者Enyim.Caching的朋友,肯定对下面的配置不会陌生:

代码如下:

type="Enyim.Caching.Configuration.MemcachedClientSection, Enyim.Caching" />

或:
代码如下:



在出现上面配置的配置文件中,我们就会找到名称为"enyim.com"或者"log4net"的节点,尽管它们本不属于config文件的默认节点,但是通过上面的配置之后程序运行并不会报错。这样一来,相关配置信息也可以很好分类保存起来。

在这里我演示一个简单的例子,这个例子来源于我的一个从2006年起就开始开发的自用软件(因为没有美化所以没有免费发布),在这个应用程序的connfig文件中我增加了一些特有的配置,所以新增了一个自己的节点,app.config文件内容如下:
代码如下:


  
         
   
  
     
         
             
               
               
               
             
      
    
       
  
  

       
          
          
          
         
       
  
    


在config文件中我们使用
告诉应用程序对于配置文件中的SoftwareSettings节点,其对应的类是ImageAssistant程序集中ImageAssistant.Configuration.SoftwareSettings类,并且在节点中我们还看到有节点和节点,其中是一个节点集合,还包含有多个子节点,为了表示清楚这些关系我们需要添加四个类:SoftwareSettings、LoadSettingsCollection、LoadSettingsElement及PathSettingElement。为了发布方便,我将这四个类的代码放在一个物理文件中,代码如下(注意添加对System.Configuration.dll的引用):
代码如下:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Configuration; 

namespace ImageAssistant.Configuration 

    public sealed class LoadSettingsCollection : ConfigurationElementCollection 
    { 
        private IDictionary settings; 

        protected override ConfigurationElement CreateNewElement() 
        { 
            return new LoadSettingsElement(); 
        } 

        protected override object GetElementKey(ConfigurationElement element) 
        { 
            LoadSettingsElement ep = (LoadSettingsElement)element; 

            return ep.Key; 
        } 

        protected override string ElementName 
        { 
            get 
            { 
                return base.ElementName; 
            } 
        } 

        public IDictionary Settings 
        { 
            get 
            { 
                if (settings == null) 
                { 
                    settings = new Dictionary(); 
                    foreach (LoadSettingsElement e in this) 
                    { 
                        settings.Add(e.Key, e.Value); 
                    } 
                } 
                return settings; 
            } 
        } 

        public bool this[string key] 
        { 
            get 
            { 
                bool isLoad = true; 
                if (settings.TryGetValue(key, out isLoad)) 
                { 
                    return isLoad; 
                } 
                else 
                { 
                    throw new ArgumentException("没有对'" + key + "'节点进行配置。"); 
                } 
            } 
        } 

    } 

    public class LoadSettingsElement : ConfigurationElement 
    { 
        [ConfigurationProperty("key", IsRequired = true)] 
        public string Key 
        { 
            get { return (string)base["key"]; } 
            set { base["key"] = value; } 
        } 
        [ConfigurationProperty("value", IsRequired = true)] 
        public bool Value 
        { 
            get { return (bool)base["value"]; } 
            set { base["value"] = value; } 
        } 
    } 

    public class PathSettingElement : ConfigurationElement 
    { 
        ///   
        ///   
        ///
  
        [ConfigurationProperty("SavePath", IsRequired = true)] 
        public string SavePath 
        { 
            get { return (string)base["SavePath"]; } 
            set { base["SavePath"] = value; } 
        } 
        ///   
        ///   
        ///
  
        [ConfigurationProperty("SearchSubPath", IsRequired = false, DefaultValue = true)] 
        public bool SearchSubPath 
        { 
            get { return (bool)base["SearchSubPath"]; } 
            set { base["SearchSubPath"] = value; } 
        } 
    } 

    ///   
    /// 对应config文件中的  
    ///
  
    public sealed class SoftwareSettings : ConfigurationSection 
    { 
        ///   
        /// 对应SoftwareSettings节点下的LoadSettings子节点  
        ///
  
        [ConfigurationProperty("LoadSettings", IsRequired = true)] 
        public LoadSettingsCollection LoadSettings 
        { 
            get { return (LoadSettingsCollection)base["LoadSettings"]; } 
        } 

        ///   
        /// 对应SoftwareSettings节点下的PathSettings子节点,非必须  
        ///
  
        [ConfigurationProperty("PathSettings", IsRequired = false)] 
        public PathSettingElement PathSetting 
        { 
            get { return (PathSettingElement)base["PathSettings"]; } 
            set { base["PathSettings"] = value; } 
        } 

    } 
}

在上面的代码中可以看到ConfigurationProperty这个属性,这是表示对应的属性在config文件中的属性名,IsRequired表示是否是必须的属性,还有DefaultValue表示属性的默认值。初次之外,我们还要注意以下关系:
SoftwareSettings:根节点,继承自ConfigurationSection。
LoadSettingsCollection:子节点集合,继承自ConfigurationElementCollection。
LoadSettingsElement:子节点,继承自ConfigurationElement。
PathSettingElement:子节点,继承自ConfigurationElement。
编写了如下代码之后,我们又该如何使用上面的类呢?其实很简单,如下:
代码如下:

class Program 
    { 
        static void Main(string[] args) 
        { 
            SoftwareSettings softSettings = ConfigurationManager.GetSection("SoftwareSettings") as SoftwareSettings; 

            foreach (string key in softSettings.LoadSettings.Settings.Keys) 
            { 
                Console.WriteLine("{0}={1}", key, softSettings.LoadSettings[key]); 
            } 
            Console.WriteLine("SavePath={0},SearchSubPath={1}", softSettings.PathSetting.SavePath, softSettings.PathSetting.SearchSubPath); 
            Console.ReadLine(); 
        } 
    }

这个程序的运行结果如下:
LoadBmp=True
LoadJpg=True
LoadGif=True
LoadPng=False
SavePath=C:/ResizeImages/,SearchSubPath=True

总结:在上面的config文件中通过也达到了类似的效果,但是通过自定义节点我们可以方便地读取相关的应用程序配置,同时也便于维护。如果在开发过程中遇到本文中类似的情况,不妨采取本文所述的方式。


推荐阅读
  • Spring源码解密之默认标签的解析方式分析
    本文分析了Spring源码解密中默认标签的解析方式。通过对命名空间的判断,区分默认命名空间和自定义命名空间,并采用不同的解析方式。其中,bean标签的解析最为复杂和重要。 ... [详细]
  • 本文介绍了使用AJAX的POST请求实现数据修改功能的方法。通过ajax-post技术,可以实现在输入某个id后,通过ajax技术调用post.jsp修改具有该id记录的姓名的值。文章还提到了AJAX的概念和作用,以及使用async参数和open()方法的注意事项。同时强调了不推荐使用async=false的情况,并解释了JavaScript等待服务器响应的机制。 ... [详细]
  • Java序列化对象传给PHP的方法及原理解析
    本文介绍了Java序列化对象传给PHP的方法及原理,包括Java对象传递的方式、序列化的方式、PHP中的序列化用法介绍、Java是否能反序列化PHP的数据、Java序列化的原理以及解决Java序列化中的问题。同时还解释了序列化的概念和作用,以及代码执行序列化所需要的权限。最后指出,序列化会将对象实例的所有字段都进行序列化,使得数据能够被表示为实例的序列化数据,但只有能够解释该格式的代码才能够确定数据的内容。 ... [详细]
  • 本文介绍了Java工具类库Hutool,该工具包封装了对文件、流、加密解密、转码、正则、线程、XML等JDK方法的封装,并提供了各种Util工具类。同时,还介绍了Hutool的组件,包括动态代理、布隆过滤、缓存、定时任务等功能。该工具包可以简化Java代码,提高开发效率。 ... [详细]
  • android listview OnItemClickListener失效原因
    最近在做listview时发现OnItemClickListener失效的问题,经过查找发现是因为button的原因。不仅listitem中存在button会影响OnItemClickListener事件的失效,还会导致单击后listview每个item的背景改变,使得item中的所有有关焦点的事件都失效。本文给出了一个范例来说明这种情况,并提供了解决方法。 ... [详细]
  • 本文讨论了Alink回归预测的不完善问题,指出目前主要针对Python做案例,对其他语言支持不足。同时介绍了pom.xml文件的基本结构和使用方法,以及Maven的相关知识。最后,对Alink回归预测的未来发展提出了期待。 ... [详细]
  • 本文讲述了如何通过代码在Android中更改Recycler视图项的背景颜色。通过在onBindViewHolder方法中设置条件判断,可以实现根据条件改变背景颜色的效果。同时,还介绍了如何修改底部边框颜色以及提供了RecyclerView Fragment layout.xml和项目布局文件的示例代码。 ... [详细]
  • 在说Hibernate映射前,我们先来了解下对象关系映射ORM。ORM的实现思想就是将关系数据库中表的数据映射成对象,以对象的形式展现。这样开发人员就可以把对数据库的操作转化为对 ... [详细]
  • 本文介绍了在SpringBoot中集成thymeleaf前端模版的配置步骤,包括在application.properties配置文件中添加thymeleaf的配置信息,引入thymeleaf的jar包,以及创建PageController并添加index方法。 ... [详细]
  • 本文讨论了在Spring 3.1中,数据源未能自动连接到@Configuration类的错误原因,并提供了解决方法。作者发现了错误的原因,并在代码中手动定义了PersistenceAnnotationBeanPostProcessor。作者删除了该定义后,问题得到解决。此外,作者还指出了默认的PersistenceAnnotationBeanPostProcessor的注册方式,并提供了自定义该bean定义的方法。 ... [详细]
  • eclipse学习(第三章:ssh中的Hibernate)——11.Hibernate的缓存(2级缓存,get和load)
    本文介绍了eclipse学习中的第三章内容,主要讲解了ssh中的Hibernate的缓存,包括2级缓存和get方法、load方法的区别。文章还涉及了项目实践和相关知识点的讲解。 ... [详细]
  • ZSI.generate.Wsdl2PythonError: unsupported local simpleType restriction ... [详细]
  • XML介绍与使用的概述及标签规则
    本文介绍了XML的基本概念和用途,包括XML的可扩展性和标签的自定义特性。同时还详细解释了XML标签的规则,包括标签的尖括号和合法标识符的组成,标签必须成对出现的原则以及特殊标签的使用方法。通过本文的阅读,读者可以对XML的基本知识有一个全面的了解。 ... [详细]
  • Java验证码——kaptcha的使用配置及样式
    本文介绍了如何使用kaptcha库来实现Java验证码的配置和样式设置,包括pom.xml的依赖配置和web.xml中servlet的配置。 ... [详细]
  • HDFS2.x新特性
    一、集群间数据拷贝scp实现两个远程主机之间的文件复制scp-rhello.txtroothadoop103:useratguiguhello.txt推pushscp-rr ... [详细]
author-avatar
手机用户2502907057
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有