C#自定義配置文件(一)

C#自定義配置文件

.NET程式中,經常使用Config文件來配置應用程式中經常使用的值,比如資料庫連接字元串。最近項目遇到一個需要配置好多節點在配置文件中的需求。為了使配置節點整潔易維護,在程式碼調用時也保證獲取時比較直觀,結合自定義配置文件專門整理了一個配置文件幫助類Demo。此篇文章主要講述自定義配置文件的使用方法。


常見配置文件使用方法

  • 直接在connectionStrings\appSettings這兩個節點中添加add節點配置
    • 這種方式在項目中很常見,使用簡單,這裡不做介紹
  • 文件操作
    • 很多程式中(自己公司老項目),通過獲取指定路徑下XML\ini\json\txt等文件,通過IO獲取文件內容並對文件進行解析,從而獲取程式需要的配置資訊(不推薦)

自定義配置文件

在App.Config(web.config)中指定其他配置文件的路徑和節點。
在configSections節點下配置section節點,.NET提供自帶的類型進行封裝。(NameValue鍵值對、Dictionary字典、SingTag基礎結構)。Section節點的name屬性是自定義節點的名稱,type是接收資訊的數據類型。
注意!configSections節點必須為configuration下第一個節點

configSections的name屬性為自定義配置節點的名稱,type 為轉換的類型

ConfigurationManager.GetSection("name") 方法的參數是自定義配置文件節點的名稱

NameValue鍵值對

配置語法格式:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
	<configSections>
		<!--以NameValueCollection鍵值對的形式返回配置節點中的資訊,type值固定為System.Configuration.NameValueSectionHandler-->
		<section name="NameValueConfigNode" type="System.Configuration.NameValueSectionHandler"/>
	</configSections>
	<!--自定義配置節點-->
	<NameValueConfigNode>
		<add key="Name一" value="Value一" />
		<add key="Name二" value="Value二" />
		<add key="Name三" value="Value三" />
	</NameValueConfigNode>
    <startup> 
        <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.8" />
    </startup>
</configuration>

調用方法:這裡以一個靜態屬性的方法獲取並返回Dictionary格式(後面幾種方法也採用這個方式)

/// <summary>
/// NameValueCollection
/// </summary>
public static Dictionary<string, string> NameValueConfigNode
{
    get
    {
        NameValueCollection nvc = (NameValueCollection)ConfigurationManager.GetSection("NameValueConfigNode");
        Dictionary<string, string> result = new Dictionary<string,string>();
         foreach (string key in nvc.AllKeys)
        { 
            result.Add(key, nvc[key]);
        }
        return result;
    }
}

Dictionary

配置文件語法格式:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
	<configSections>
		<!--以Dictionary字典的形式返回配置節點中的資訊,type固定為System.Configuration.DictionarySectionHandler-->
		<section name="DictionaryConfigNode" type="System.Configuration.DictionarySectionHandler"/>
	</configSections>
	<!--自定義配置節點-->
	<DictionaryConfigNode>
		<add key="Key一" value="DictValue一" />
		<add key="Key二" value="DictValue二" />
		<add key="Key三" value="DictValue三" />
	</DictionaryConfigNode>
    <startup> 
        <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.8" />
    </startup>
</configuration>

調用方法:

/// <summary>
/// Dictionary
/// </summary>
public static Dictionary<string, string> DictionaryConfigNode
{
    get
    {
        IDictionary dict = (IDictionary)ConfigurationManager.GetSection("DictionaryConfigNode");
        Dictionary<string, string> result = new Dictionary<string, string>();
        foreach (string key in dict.Keys)
        {
            result.Add(key, dict[key].ToString());
        }
        return result;
    }
}

SingTag

配置文件語法格式:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
	<configSections>
		<!--基礎結構處理 .config 文件中由單個 XML 標記所表示的各配置節點中的值,type固定為System.Configuration.SingleTagSectionHandler-->
		<section name="SingleTagConfigNode" type="System.Configuration.SingleTagSectionHandler" />
	</configSections>
	<!--自定義配置節點-->
	<!--注意,只能是單個節SingleTagSectionHandler才能處理,無論有多少個屬性都能處理-->
	<SingleTagConfigNode PropertyOne="1" PropertyTwo="2" PropertyThree="3" PropertyFour="4" PropertyFive="5" />
    <startup> 
        <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.8" />
    </startup>
</configuration>

調用方法:

/// <summary>
/// SingleTag
/// </summary>
public static Dictionary<string, string> SingleTagConfigNode
{
    get
    {
        Hashtable dict = (Hashtable)ConfigurationManager.GetSection("SingleTagConfigNode");
        Dictionary<string, string> result = new Dictionary<string, string>();
        foreach (string key in dict.Keys)
        {
            result.Add(key, dict[key].ToString());
        }
        return result;
    }
}

以上程式通過控制台應用程式測試調用效果如下:

Lsbv5T.png

自定義配置文件

以上三種方法,只能讀取應用程式的Web.config或者app.config中的配置資訊,但是在大多數項目中,業務場景複雜,配置資訊更是多到看不過來,所以如果都寫在web.config或者app.config中的話,不太美觀,也不易維護。

那麼有沒有一種方法,可以根據需要,配置一個或者多個的config,並且在程式中直接調用使用的方法? (問就是有^_^)

下面舉例一種自定義配置文件的寫法
配置文件寫法:
<configSections>節點下<section>的屬性值內容與上面三個方法相同。需要注意的是自定義節點,自定義節點只需要設置configSource屬性即可,屬性值指向自定義配置文件的路徑;
注意:路徑必須要寫成相對路徑。

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
	<configSections>
		<!--把MyConfigData節點的數據映射到MyConfigData類中-->
		<section name="MyConfigData" type="ConsoleApplication.ConfigFiles.ConfigFile,ConsoleApplication"/>
	</configSections>
	<!--自定義配置節點,configSource指定自定義配置文件的路徑(必須是相對路徑)-->
	<MyConfigData configSource="ConfigFiles\Framework.config"/>
    <startup> 
        <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.8" />
    </startup>
</configuration>

這是自定義的文件內容,

<?xml version="1.0" encoding="utf-8" ?>
<MyConfigData>
	<add key="Key一" value="自定義文件一" />
	<add key="Key二" value="自定義文件二" />
	<add key="Key三" value="自定義文件三" />
</MyConfigData>

程式中的調用方法與上面的方式一致,這種自定義配置文件的精髓在於,不用將所有配置資訊都擠在一個文件中,而是根據項目需要合理的分成多個配置,只需要在web.config或者app.config中指定文件路徑即可。其他使用方法沒有差別

自定義結構配置文件

以上方法為常用的基本配置文件的使用方法,都是使用C#提供的類型進行獲取,配置文件的節點需要按照對應格式設置,C#中還有一種可以自定義配置文件格式的調用方法,Config中科自定義節點的結構,然後在程式中需要自定義一個配置文件的類,用於接收自定義配置文件的內容;
其中使用到的類型:
ConfigurationSection、ConfigurationElementCollection、ConfigurationElement、ConfigurationProperty
上面介紹的幾種方法基本上已經足夠日常使用,此篇文章不在進行介紹自定義格式的寫法,後期會根據個人情況(是否懶惰的情況),可能會補充此部分功能,有興趣可以去了解一下。

寫在最後

以上源程式碼已經放在Gitee上,可自行下載,
//gitee.com/yang-yong-666/csharp
該項目還包含其他關於C#的幫助類,並且會持續更新!


個人交流QQ:1695690324
原創不易,轉載請註明出處
部落格園://www.cnblogs.com/yangyongdashen-S/
CSDN://blog.csdn.net/weixin_44312699?spm=1010.2135.3001.5343
Gitee://gitee.com/yang-yong-666
公眾號:yi人夕岸