自定义配置节与配置节的读取
生活随笔
收集整理的這篇文章主要介紹了
自定义配置节与配置节的读取
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
一、引子
?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>
?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> 三、代碼
?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?????}?
?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?????} 四、調用
?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?????}
你是否也遇到過這樣的問題:項目很多配置都寫到了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.ConfigReaderVersion:1.0Description:This is description.?
轉載于:https://www.cnblogs.com/hetring/p/4182579.html
總結
以上是生活随笔為你收集整理的自定义配置节与配置节的读取的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 免费LInux主机资源
- 下一篇: vsftp服务器搭建