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

一、引子

你是否也遇到过这样的问题:项目很多配置都写到了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 { getset; }
 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.

 

转载于:https://www.cnblogs.com/hetring/p/4182579.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/398644.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

机器学习的练功方式(九)——线性回归

文章目录致谢9 线性回归再相遇9.1 再遇9.1.1 概述9.1.2 矩阵和向量9.1.3 矩阵加减乘除9.1.3.1 矩阵——矩阵加减9.1.3.2 矩阵——标量加减乘9.1.3.3 矩阵——向量相乘9.1.3.4 矩阵——矩阵相乘9.1.3.5 矩阵的逆9.1.3.6 矩阵的转置9.1.4 向量化9.1.5 广义线性模型9.2 正规方程9.…

vsftp服务器搭建

1.FTP的主动模式和被动模式的区别&#xff1a; 最大的区别是数据端口并不总是20&#xff0c; 主动模式和被动模式的优缺点&#xff1a; 主动FTP对FTP服务器的管理和安全很有利&#xff0c;但对客户端的管理不利。因为FTP服务器企图与客户端的高位随机端口建立连接&#xff0c;而…

12个月份统计分组

/** 根据月份来统计trade里面的入账&#xff0c;支出&#xff0c;总盈利*/public function countMonth(){$in array();$out array();$res array();$year date("Y",time());$in_sql SELECT SUM(money) AS mon, FROM_UNIXTIME(cdate, "%m") AS m FR…

深度学习修炼(一)——从机器学习转向深度学习

文章目录1 转变1.1 前言1.2 基本元素1.2.1 张量1.2.2 创建张量1.2.3 操纵张量1.2.3.1 张量乘法1.2.3.2 哈达玛积1.2.3.3 降维1.2.3.4 转置1.2.3.5 范数1.2.3.6 拼接张量1.2.4 张量属性1.2.5 张量和Numpy1.2.5.1 张量变Numpy1.2.5.2 Numpy变张量1.3 后话1 转变 1.1 前言 在之前…

idea 调试技巧1

1 多线程调试 开发过多线程应用的朋友应该有体会&#xff0c;有些时候&#xff0c;为了观察多个线程间变量的不同状态&#xff0c;以及锁的获取等&#xff0c;就会想到在代码里加个断点debug一下。 在IDE里断点停下来的时候&#xff0c;可以切换到另外的线程中&#xff0c;跑其…

SQL server 复习一

第一天 下面我们从最基础的开始&#xff1a; 在运行里面输入:services.msc 一、启动服务 二、数据库登录的两种身份验证方式 另外一种身份验证方式就是SQL Server身份验证. sa不能使用的时候可以这样的操作&#xff1a; 1.用windows登录&#xff0c;然后在“实例”右键“属性”…

[分享]iOS开发-实现view底部控件随着键盘的弹出而上移的效果

首先说一下思路&#xff1a;想要达到底部控件随着键盘的弹出而上移的效果&#xff0c;那么我们必然需要的到键盘在弹出时的高度&#xff0c;以及原点坐标。说白了我们的大致思路就是&#xff0c;用view的高度&#xff0d;键盘弹出时的高度&#xff0c;得到的值就是底部控件与vi…

深度学习修炼(二)——数据集的加载

文章目录致谢2 数据集的加载2.1 框架数据集的加载2.2 自定义数据集2.3 准备数据以进行数据加载器训练致谢 Pytorch自带数据集介绍_godblesstao的博客-CSDN博客_pytorch自带数据集 2 数据集的加载 与sklearn中的datasets自带数据集类似&#xff0c;pytorch框架也为我们提供了数…

Node.js 函数

在JavaScript中&#xff0c;一个函数可以作为另一个函数接收一个参数。我们可以先定义一个函数&#xff0c;然后传递&#xff0c;也可以在传递参数的地方直接定义函数。 Node.js中函数的使用与Javascript类似&#xff0c;举例来说&#xff0c;你可以这样做&#xff1a; functio…

在Entity Framework 4.0中使用 Repository 和 Unit of Work 模式

【原文地址】Using Repository and Unit of Work patterns with Entity Framework 4.0 【原文发表日期】 16 June 09 04:08 PM 如果你一直在关注这个博客的话&#xff0c;你知道我最近在讨论我们加到Entity Framework 4.0中的POCO功能的方方面面&#xff0c;新加的POCO支持促成…

Css3之基础-5 Css 背景、渐变属性

一、CSS 背景概述背景属性的作用- 背景样式可以控制 HTML 元素的背景颜色、背景图像等 - 背景色- 设置单一的颜色作为背景- 背景图像- 以图片作为背景- 可以设置图像的位置、平铺、尺寸等二、CSS 背景属性背景色 background-color - 属性用于为元素设置背景色- 接受任何合法的颜…

[Angularjs]锚点操作服务$anchorScroll

写在前面 有个单页应用的项目中&#xff0c;需要通过锚点进行页面的定位。但angularjs的路由会出现跟锚点冲突&#xff0c;angularjs会将锚点当成路由进行解析&#xff0c;造成跳转到这个页面&#xff0c;而我们需要的只是跳转到当前的锚点位置。angularjs的路由格式#/home/en。…

机器学习的练功方式(十)——岭回归

文章目录十 岭回归10.1 岭回归的接口10.2 岭回归处理房价预测十 岭回归 岭回归是线性回归的改进&#xff0c;有时候迫不得已我们的参数确实不能少&#xff0c;这时候过拟合的现象就可能发生。为了避免过拟合现象的发生&#xff0c;既然不能从减少参数上面下手&#xff0c;那我…

js产生随机数

<script>document.write(parseInt(10*Math.random()));  //输出0&#xff5e;10之间的随机整数document.write(Math.floor(Math.random()*101));  //输出1&#xff5e;10之间的随机整数function RndNum(n){var rnd"";for(var i0;i<n;i)rndMath.floor(Math…

JS实现在输入框内输入@时,邮箱账号自动补全

<!DOCTYPE HTML><html lang"en"><head><meta charset"utf-8"/><title>邮箱自动补全</title><style type"text/css">.wrap{width:200px;margin:0 auto;}h1{font-size:36px;text-align:center;line-hei…

OpenCV修养(一)——引入

文章目录1 引入1.1 OpenCV是啥1.2 OpenCV——Python1 引入 1.1 OpenCV是啥 OpenCV是一个基于Apache2.0许可&#xff08;开源&#xff09;发行的跨平台计算机视觉计算机视觉和机器学习软件库&#xff0c;可以运行在Linux、Windows、Android和Mac OS操作系统上。 它轻量级而且高…

动态创建 Plist 文件

简介 Property List&#xff0c;属性列表文件&#xff0c;它是一种用来存储串行化后的对象的文件。属性列表文件的扩展名为.plist &#xff0c;因此通常被称为 plist文件&#xff0c;文件是xml格式的。 写入plist文件 在开发过程中&#xff0c;有时候需要把程序的一些配置保存下…

[Everyday Mathematics]20150101

(1). 设 $f(x),g(x)$ 在 $[a,b]$ 上同时单调递增或单调递减, 试证: \[ (b-a)\int_a^b f(x)g(x)\mathrm{\,d}x \geq \int_a^b f(x)\mathrm{\,d}x\cdot \int_a^b g(x)\mathrm{\,d}x. \] (2). 试证: \[ c\in (0,1)\Rightarrow \int_c^1 \dfrac{e^t}{t}\mathrm{\,d}t \geq e\cdot …

被解放的姜戈08 远走高飞

作者&#xff1a;Vamei 出处&#xff1a;http://www.cnblogs.com/vamei 转载请先与我联系。 之前在单机上实现了一个Django服务器&#xff08;被解放的姜戈07 马不停蹄&#xff09;&#xff0c;现在我们可以把这个服务器推上一个云平台。这里我选择使用阿里云。 看着复仇的火焰…

OpenCV修养(二)——OpenCV基本操作

文章目录2 OpenCV基本操作2.1 IO操作2.2 图像基本操作2.2.1 图像绘制2.2.1.1 绘制直线2.2.1.2 绘制圆形2.2.1.3 绘制矩形2.2.1.4 添加文字2.2.1.5 试手2.2.2 获取/修改图像的像素点2.2.3 获取图像属性2.2.4 图像通道拆分/合并2.2.5 色彩空间改变2.2.6 边界填充2.3图像算数操作2…