.Net配置文件——统一节点配置管理

       对于.Net中的自定义节点,如果要单独处理,就要为这个节点添加一个指定的类,如果我们在一个应用程序中,定义了很多个自定义节点的话,还按照这样做,就会多出很多个处理类来,为了避免太多的类,我们将所有自定节点都指定一个自定义节点作为入口,然后只写一个处理类,以此为入口,读取其他节点。

    例如,配置文件只定义一个入口节点:

  

 <!--通用配置存储方法-->
  <traceFact type="ClassLib.ConfigManager,ClassLib">

    <forum name="TraceFact.Net Community">
      <root url="http:192.168.24.204"/>
      <replyCount>20</replyCount>
      <pageSize>30</pageSize>
      <offlineTime>20</offlineTime>
    </forum>

    <blog>
      <root url="http:asdakfj.com"/>
      <urlMappings>
        <rewriteRule>
          <request>~/(\d{4})/Default\.aspx</request>
          <sendTo>~BlogDetail.aspx?year=$1</sendTo>
        </rewriteRule>
      </urlMappings>
    </blog>   

    <mailServer address="www.baidu.com" userName="lhc" password="234r32r"/>

    <greetingStrategy type="ClassLib.ChineseGreeting,ClassLib"/>

  </traceFact>
  

      处理类:

   

 /// <summary>
    /// Class GeneralConfigHandler
    /// </summary>
    /// <remarks>Editor:v-liuhch CreateTime:2015/7/1 10:50:40</remarks>
    public class GeneralConfigHandler:IConfigurationSectionHandler
    {
        /// <summary>
        /// 创建配置节处理程序。
        /// </summary>
        /// <param name="parent">父对象。</param>
        /// <param name="configContext">配置上下文对象。</param>
        /// <param name="section">节 XML 节点。</param>
        /// <returns>创建的节处理程序对象。</returns>
        /// <exception cref="System.NotImplementedException"></exception>
        /// <remarks>Editor:v-liuhch CreateTime:2015/7/1 10:50:42</remarks>
        public object Create(object parent, object configContext, XmlNode section)
        {
            //获取节点type属性的值
            Type t=Type.GetType(section.Attributes["type"].Value);//返回configManager
            //直接将section进行传递
            object[] paramters={section};
            //将要创建的类型实例
            object obj = null;

            try
            {
                obj = Activator.CreateInstance(t, paramters);//使用有参数的构造函数

            }
            catch (Exception)
            {

                return null;
            }
            return obj;
        }
    }

      

        上面的类主要是为了实现创建具体配置节点管理类,在配置节点的管理类中,存有各个子节点类的引用。

 

 /// <summary>
    /// GeneralConfigHandler通过反射动态创建的,它实际上只是作为一个容器
    ///这个类仅仅是作为一个容器,包含对其下具体节点配置的引用,并通过traceFact根节点,获取traceFact其下的子节点,然后再创建用于映射具体的子节点的类型实例
    /// </summary>
    /// <remarks>Editor:v-liuhch CreateTime:2015/7/1 14:06:21</remarks>
    public class ConfigManager
    {
        private XmlNode section;
        private FroumConfiguration forumConfig;
        //对于其他节点的处理强类型访问类也定义为成员变量放在这里。。。。。。。

        public FroumConfiguration froumConfig {

            get { return forumConfig; }
        }

        public ConfigManager(XmlNode section) {
            this.section = section;
            forumConfig = new FroumConfiguration(section.SelectSingleNode("forum"));
        }
    }

    /// <summary>
    /// 具体子节点配置forum结点:处理<forum name="TraceFact.Net Community">
    /// </summary>
    /// <remarks>Editor:v-liuhch CreateTime:2015/7/1 14:22:08</remarks>
    public class FroumConfiguration{
        private XmlNode forumNode;

        //将forum结点传递进来
        public FroumConfiguration(XmlNode section){
            this.forumNode=section;
        }

        /// <summary>
        /// Gets the name. <forum name="TraceFact.Net Community">
        /// </summary>
        /// <value>The name.</value>
        /// <remarks>Editor:v-liuhch CreateTime:2015/7/1 14:58:00</remarks>
        public string Name{
            get{
                return forumNode.Attributes["name"].Value;
                }
        }
        /// <summary>
        /// Gets the root URL.:<root url="http:192.168.24.204"/>
        /// </summary>
        /// <value>The root URL.</value>
        /// <remarks>Editor:v-liuhch CreateTime:2015/7/1 14:56:08</remarks>
        public string RootUrl{

            get{
                return forumNode.SelectSingleNode("root").Attributes["url"].Value;
            }
        }

        /// <summary>
        /// Gets the size of the page.<pageSize>30</pageSize>
        /// </summary>
        /// <value>The size of the page.</value>
        /// <remarks>Editor:v-liuhch CreateTime:2015/7/1 14:57:18</remarks>
        public int PageSize{

            get{
                return int.Parse(forumNode.SelectSingleNode("pageSize").InnerText);
            }
        }

        /// <summary>
        /// Gets the reply count.<replyCount>20</replyCount>
        /// </summary>
        /// <value>The reply count.</value>
        /// <remarks>Editor:v-liuhch CreateTime:2015/7/1 14:57:03</remarks>
        public int ReplyCount{

            get{
                return int.Parse(forumNode.SelectSingleNode("replyCount").InnerText);
            }
        }

        /// <summary>
        /// Gets the offline time.<offlineTime>20</offlineTime>
        /// </summary>
        /// <value>The offline time.</value>
        /// <remarks>Editor:v-liuhch CreateTime:2015/7/1 14:57:35</remarks>
        public int OfflineTime {
            get {
                return int.Parse(forumNode.SelectSingleNode("offlineTime").InnerText);

            }
        }
    }

      这样,我们使用的时候,每次都用这一个类来实现对节点的访问:

      

 ConfigManager config = ConfigurationManager.GetSection("traceFact") as ConfigManager;

            //取值
            ltrName.Text = config.froumConfig.Name;
            ltrOfflineTime.Text = config.froumConfig.OfflineTime.ToString();
            ltrPageSize.Text = config.froumConfig.PageSize.ToString();
            ltrReplyCount.Text = config.froumConfig.ReplyCount.ToString();
            ltrRootUrl.Text = config.froumConfig.RootUrl.ToString();

 

时间: 2024-10-23 20:06:39

.Net配置文件——统一节点配置管理的相关文章

.NET加密配置文件connectionStrings节点

具体的可以参考petshop源码程序. 加密前: <connectionStrings> <add name="SQLProfileConnString" connectionString="server=(local);user id=mspetshop;password=pass@word1;database=MSPetShop4Profile;min pool size=4;max pool size=4;packet size=3072"

ZooKeeper 笔记(3) 实战应用之【统一配置管理】

大型应用通常会按业务拆分成一个个业务子系统,这些大大小小的子应用,往往会使用一些公用的资源,比如:需要文件上传.下载时,各子应用都会访问公用的Ftp服务器.如果把Ftp Server的连接IP.端口号.用户名.密码等信息,配置在各子应用中,然后这些子应用再部署到服务器集群中的N台Server上,突然有一天,Ftp服务器要换IP或端口号,那么问题来了?不要紧张,不是问 挖掘机哪家强:),而是如何快速的把这一堆已经在线上运行的子应用,通通换掉相应的配置,而且还不能停机. 要解决这个问题,首先要从思路

XXL-CONF v1.3.0,分布式配置管理平台

版本1.3.0新特性 1.支持在线维护配置分组: 2.项目groupId从com.xxl迁移至com.xuxueli,为推送maven中央仓库做准备: 3.v1.3.0版本开始,推送公共依赖至中央仓库: <dependency> <groupId>com.xuxueli</groupId> <artifactId>xxl-conf-core</artifactId> <version>1.3.0</version> <

Git.Framework 框架随手记--SQL配置文件的使用

前面几篇文章讲到了如何使用框架进行简单结构的增删改查操作,由于个人能力有限在对于复杂的SQL操作面前也是无能为力,只能自己动手来写SQL语句.在Git.Framework中提供了一个公共的接口来直接操作SQL语句. 一. SQL配置文件的结构简介 在这个框架中提供了单独的配置文件用于来管理SQL语句,当然也可以不用配置文件.使用SQL配置文件系统在启动的时候会直接将SQL配置文件转化为Command对象缓存,而不用后期再去创建,这是一个比较不错的优势.下面先看看SQL配置文件的结构 <dataO

ASP.NET Core实现类库项目读取配置文件

前言 之前继续在学习多线程方面的知识,忽然这两天看到博问中有个园友问到如何在.net core类库中读取配置文件,当时一下蒙了,这个提的多好,我居然不知道,于是这两天了解了相关内容才有此篇博客的出现,正常来讲我们在应用程序目录下有个appsettings.json文件对于相关配置都会放在这个json文件中,但是要是我建立一个类库项目,对于一些配置比如密钥或者其他需要硬编码的数据放在JSON文件中,在.net core之前配置文件为web.config并且有相关的类来读取节点上的数据,现如今在.n

ASP.NET配置文件纵横谈(一)

前言:之所以写这个系列的文章的缘由来自于Jeffery Zhao.之前看老赵的"MVC"讲座的时候,记得老 赵曾经说过:一个真正的ASP.NET程序员应该对配置文件web.config要很熟练,而且对于配置文件的节点 的相关知识都要很了解,现有的很多的ASP.NET书籍都只是将控件怎么使用等等,而且现有的一些参考文档 都是只是讲讲配置节点怎么使用,很少详细的讲述配置文件的(注:老赵的原话不是这样的:).所以这 里我大胆的写了本系列的文章,有欠妥当的地方还望大家见谅! 首先我们就来看看配

在C#代码中应用Log4Net(三)Log4Net中配置文件的解释

一个完整的配置文件的例子如下所示,这个是"在C#代码中应用Log4Net(二)"中使用的配置文件. <log4net> <!-- 错误日志类--> <logger name="logerror"> <level value="ALL" /> <appender-ref ref="ErrorAppender" /> </logger> <!-- 信息日

高效组织的配置管理计划

根据IEEE 828和CMM/CMMI,配置管理计划常常被认为是一份文档,确实的,对于一个大项目而言,往往需要制定项目自身的配置管理计划. 但不是所有的组织都是软件外包组织,不是每个项目针对的是不同的客户. 在非软件外包的高效软件开发组织中,推荐的配置管理计划应有三个层面. 首先是组织层面,一般,提供统一的配置管理服务,不会允许每个团队自己搭建配置管理服务器.所以对于组织级的配置管理服务要有所约定,约定的主要内容有: 如何建立项目文档目录? 如何建立产品级目录? 如何建立代码目录? 配置项如何命

activiti 配置节点 连线信息获取

1.1.1. 前言 当使用eclipse插件进行流程设计的时候,部署流程之后,我们如何获取我们定义的所有的节点.连线.关口等配置信息呢?有的人看到这个需求,不免窃喜,这不很简单嘛,重新打来bmpn中定义的xml信息,查看不就完了,确实这种方式是可取的,但是当我们的项目流程在启动的时候,我们想要获取定义的信息的时候,换言之就是 我们能动态的读取里面的信息反馈给系统用户的时候,我们该如何获取呢?总不能告诉用户你去打开xml文件自己去查看,用户未必能看懂里面的xml定义信息吧.这种方式不是增加了用户操