自定义配置节与配置节的读取

一、引子

你是否也遇到过这样的问题:项目很多配置都写到了App.Config或Web.Config的AppSettings内,每个人都加了几条,到最后囤积了大量的配置,分不清哪个是有用的、哪个是没用的了。(即便加了相关注释,也是乱的可以)

1   <appSettings>
 2     <!--是否抛出异常-->
 3     <add key="HasException" value="true" />
 4     <add key="Mess**********_Enable" value="true" />
 5     <add key="Mess**********_CorpCode" value="" />
 6     <add key="Mess**********_Url" value="" />
 7     <add key="Mess**********_Account" value="" />
 8     <add key="Mess**********_AuthKey" value="" />
 9     <add key="Mess**********_CGID" value="" />
10     <add key="Mess**********_MaxNumberPerHour" value="" />
11     <add key="Mess**********_Signature" value="" />
12     <add key="Mess**********__Enable" value="true" />
13     <add key="JPush**********Key" value="**********" />
14     <add key="JPush**********Secret" value="**********" />
15     <add key="Aud**********Hosts" value="127.0.0.1:1000" />
16     <!--true开启 false 关闭-->
17     <add key="Mess**********_Enable" value="true" />
18     <!--key-->
19     <add key="Baidu**********Key" value="**********" />
20     <add key="Baidu**********Secret" value="**********" />
21     <!--微信开发者 AppId,Secret和Token-->
22     <add key="AppId" value="**********" />
23     <add key="Secret" value="**********" />
24     <add key="Token" value="**********" />
25     <!--证书文件路径(退款用)-->
26     <add key="CertPath" value="E:\cert\apiclient_cert.pem" />
27     <!--App证书文件路径(退款用)-->
28     <add key="AppCertPath" value="E:\cert\**********.pfx" />
29   </appSettings>

那么问题来了,怎么解决呢?

二、方案

将同类、同项目、同模块的配置放到自定义配置节下,统一管理、读取,(可能并不是很好的解决方案,不喜勿喷)。如:

1 <configuration>
 2   <configSections>
 3     <!--自定义Section声明-->
 4     <!--name:自定义节点名称-->
 5     <!--type:读取配置信息类的命名空间,所在程序集-->
 6     <section name="AssemblyInfo" type="Hetring.ConfigReader.SectionReader,Hetring.ConfigReader" requirePermission="false"></section>
 7   </configSections>
 8 
 9   <!--名称同声明的name-->
10   <AssemblyInfo>
11     <add key="Name" value="Hetring.ConfigReader" />
12     <add key="Version" value="1.0" />
13     <add key="Description" value="This is description." />
14   </AssemblyInfo>
15 </configuration>

三、代码

自定义配置节处理程序,需继承System.Configuration.IConfigurationSectionHandler接口,并实现object Create(object parent, object configContext, XmlNode section)方法:

1     public class SectionReader : IConfigurationSectionHandler
 2     {
 3         public object Create(object parent, object configContext, System.Xml.XmlNode section)
 4         {
 5             lock (typeof(SectionReader))
 6             {
 7                 Hashtable sectionSetting = new Hashtable();//存放配置信息,也可用Dictionary<string,string>
 8 
 9                 foreach (XmlNode node in section.ChildNodes)
10                 {
11                     if (node.NodeType == XmlNodeType.Element && node.Name == "add")
12                     {
13                         var key = node.Attributes["key"].Value;
14                         var value = node.Attributes["value"].Value;
15                         sectionSetting.Add(key, value);//放入hashtable中
16                     }
17                 }
18 
19                 return sectionSetting;
20             }
21         }

22     }

读取配置节时,需要用到System.Configuration.ConfigurationManager.GetSection(SectionName)方法,获取到的是object类型对象,而我们定义的处理程序返回的是Hashtable,直接转换即可:

1     public class AssemblyInfoConfig
 2     {
 3         /// <summary>
 4         /// Section名称
 5         /// </summary>
 6         private static string SectionName = "AssemblyInfo";
 7 
 8         private static Hashtable _settings { get; set; }
 9 
10         protected static Hashtable SectionSettings
11         {
12             get
13             {
14                 //当无配置时,ConfigurationManager.GetSection()会返回null,这里强制创建一个hashtable,防止空引用
15                 if (_settings == null)
16                     _settings = (ConfigurationManager.GetSection(SectionName) as Hashtable) ?? new Hashtable();
17 
18                 return _settings;
19             }
20         }
21 
22         public static string Name
23         {
24             get
25             {
26                 return ObjectToString(SectionSettings["Name"]);
27             }
28         }
29 
30         public static string Version
31         {
32             get
33             {
34                 return ObjectToString(SectionSettings["Version"]);
35             }
36         }
37 
38         public static string Description
39         {
40             get
41             {
42                 return ObjectToString(SectionSettings["Description"]);
43             }
44         }
45 
46         #region 私有方法
47 
48         /// <summary>
49         /// 将Object转换为非null字符串
50         /// </summary>
51         /// <param name="value">待转换Object</param>
52         /// <returns>不为空的字符串(value为null,返回空字符串)</returns>
53         private static string ObjectToString(object value)
54         {
55             if (value == null)
56                 return string.Empty;
57 
58             return value.ToString();
59         }
60 
61         #endregion
62     }

四、调用

写了个控制台测试下:

1     class Program
 2     {
 3         static void Main(string[] args)
 4         {
 5             Console.WriteLine("Name:" + AssemblyInfoConfig.Name);
 6             Console.WriteLine("Version:" + AssemblyInfoConfig.Version);
 7             Console.WriteLine("Description:" + AssemblyInfoConfig.Description);
 8 
 9             Console.ReadKey();
10         }
11     }

输出结果:

Name:Hetring.ConfigReader

Version:1.0

Description:This is description.

时间: 2024-10-18 22:34:05

自定义配置节与配置节的读取的相关文章

centos LNMP第二部分nginx、php配置 第二十四节课

centos  LNMP第二部分nginx.php配置  第二十四节课 上半节课 下半节课 f

centos NFS/FTP服务配置 第二十五节课

centos  NFS/FTP服务配置   第二十五节课 上半节课 下半节课 f

ASP.NET web.config中数据库连接字符串connectionStrings节的配置方法

在ASP.NET开发的网站根目录,有一个名为web.config的文件,顾名思义,这是为整个网站进行配置的文件,其格式为XML格式.这里主要谈谈文件中的<connectionStrings>节. <connectionStrings>节是对连接到数据库的字符串进行配置,由于MS SQL Server与ASP.NET同属于微软的产品,因此是使用ASP.NET开发时首选的数据库是MS SQL Server,本文只讨论对MS SQL Server的连接字符串情况.第一种情况,本地开发时,

app.config 配置多项 配置集合 自定义配置

C#程序的配置文件,使用的最多的是appSettings 下的<add key="Interval" value="30"/>,这种配置单项的很方便,但是配置集合就不方便了(当然你可以用逗号分隔,key=key1,key2,key3……但是你还是不知道有多少个集合).现在给出解决方案. 需求:程序超级管理员采用这种设置方式,在app.config中配置的方式,可以配置多个.登陆成功后,读取config,看我是不是超级管理员.(当然,这个需求是很扯淡的,因

Jetty学习三:配置概览-需要配置什么

上一节讲述了怎么配置Jetty,这节将告诉你使用Jetty你需要配置些什么. 配置Server Server实例是Jetty服务端的中心协调对象,它为所有其他Jetty服务端组件提供服务和生命周期管理.在标准Jetty发布中,核心的服务端配置是在etc/jetty.xml文件中,你也能在其中包含其他服务端配置,可以包括: 1)ThreadPool Server实例提供了一个线程池,你可以在etc/jetty.xml中配置最大线程数和最小线程数. 2)Handlers Jetty服务端只能有一个H

.NET Core采用的全新配置系统[2]: 配置模型设计详解

在<.NET Core采用的全新配置系统[1]: 读取配置数据>中,我们通过实例的方式演示了几种典型的配置读取方式,其主要目的在于使读者朋友们从编程的角度对.NET Core的这个全新的配置系统具有一个大体上的认识,接下来我们从设计的维度来重写认识它.通过上面演示的实例我们知道,配置的编程模型涉及到三个核心对象,它们分别是Configuration.ConfigurationSource和ConfigurationBuilder.如果从设计层面来审视这个配置系统,还缺少另一个名为Configu

[ASP.NET Core 3框架揭秘] 配置[5]:配置数据与数据源的实时同步

在<配置模型总体设计>介绍配置模型核心对象的时候,我们刻意回避了与配置同步相关的API,现在我们利用一个独立文章来专门讨论这个话题.配置的同步涉及到两个方面:第一,对原始的配置源实施监控并在其发生变化之后重新加载配置:第二,配置重新加载之后及时通知应用程序进而使应用能够及时使用最新的配置.要了解配置同步机制的实现原理,我们先得了解一下配置数据的流向. 一.配置数据流 通过前面的介绍,我们已经对配置模型有了充分的了解,处于核心地位的 IConfigurationBuilder对象借助注册的ICo

[ASP.NET Core 3框架揭秘] 配置[3]:配置模型总体设计

原文:[ASP.NET Core 3框架揭秘] 配置[3]:配置模型总体设计 在<读取配置数据>([上篇],[下篇])上面一节中,我们通过实例的方式演示了几种典型的配置读取方式,接下来我们从设计的维度来重写认识配置模型.配置的编程模型涉及到三个核心对象,分别通过三个对应的接口(IConfiguration.IConfigurationSource和IConfigurationBuilder)来表示.如果从设计层面来审视背后的配置模型,还缺少另一个名通过IConfigurationProvide

Jetty:配置概览-须要配置什么

上一节讲述了怎么配置Jetty.这节将告诉你使用Jetty你须要配置些什么. 配置Server Server实例是Jetty服务端的中心协调对象,它为全部其它Jetty服务端组件提供服务和生命周期管理. 在标准Jetty公布中,核心的服务端配置是在etc/jetty.xml文件里,你也能在当中包括其它服务端配置.能够包括: 1)ThreadPool Server实例提供了一个线程池,你能够在etc/jetty.xml中配置最大线程数和最小线程数. 2)Handlers Jetty服务端仅仅能有一

Dynamics AX 2012 R3 Demo 安装与配置 - 编译和配置 (Step 3)

    在前两节中,Reinhard主要讲解了如何配置安装环境,安装数据库服务器,AOS和客户端.至此安装工作已经结束,下面Reinhard开始讲解如何编译和配置.     运行客户端后,系统弹出初始化核对清单.将生命周期服务和客户反馈选项标记为完成.点击编译应用程序.编译的过程中,窗体可能处于无法响应的假死状态,也不要关闭.这个过程比较漫长,根据你的计算机硬件配置,可能需要四五个小时.去休息一下吧.     当编译完成后,点击编译为DotNet框架通用中间语言.这个过程也比较漫长,大概需要一个