[.NET]讓 config檔中自定的 Config Session 擁有擴充的能力

config中自定的config session是使用NameValueFileSectionHandler嗎?
您可以改使用 AppSettingsSection ,讓您的 config session 擁有一些客製、擴充的能力哦!

問題

我們的 web.config 中有自定的 Config Session ,我們使用的 Type 是 NameValueFileSectionHandler 。

當在裡面的設定值逾來逾多時,是否有什麼方式,可以讓它有擴充能力呢?

 

研究

1.將原本裡面的內設定值,分成多個 Group 放到額外的 config 檔,但這樣似乎就要調整原本取 Config 值的 Method 。

2.在擴充原有的 Config Session,將比較會異動的設定搬到另一個 config 檔,讓原有取 Config 值的 Method 可以運作。

目前 方法2 對原有系統的異動比較小,所以就用使用 方法2 來解決目前的問題。

 

實作

在 config 檔中的 appSettings 區段有 file 的屬性,就可以讓我們達到這樣的效果。

所以只要將原本的type改成 System.Configuration.AppSettingsSection 。

然後就可以把其他的設定移另一個 config 之中。

用以下的例子來說明比較清楚,

 

web.config 的內容,在 MyNewSettings 區段的 file 屬性設定 MyNewSettings_Ex.config。


<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <configSections>
    <section name="MyOldSettings" type="System.Configuration.NameValueFileSectionHandler, System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
    <section name="MyNewSettings" type="System.Configuration.AppSettingsSection, System.Configuration, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
  </configSections>
  <MyOldSettings>
    <add key="1" value="one_Old"/>
    <add key="2" value="two_Old"/>
  </MyOldSettings>
  <MyNewSettings file="MyNewSettings_Ex.config">
    <add key="1" value="one_New"/>
    <add key="2" value="two_New"/>
  </MyNewSettings>
  <system.web>
    <compilation debug="true" targetFramework="4.5" />
    <httpRuntime targetFramework="4.5" />
  </system.web>
</configuration>

 

 

MyNewSettings_Ex.config 的內容如下(root tag 要跟原本的一樣哦!),


<?xml version="1.0" encoding="utf-8"?>
<MyNewSettings>
  <add key="1" value="one_New_Ex"/>
  <add key="3" value="three_New_Ex"/>
</MyNewSettings>

 

 

所以程式可以透過原有 Method (GetConfigSettingValue),取得 MyOldSettings 及 MyNewSettings 的設定值,如下,


public static string GetConfigSettingValue(string sessionName, string keyName)
{
	string result = string.Empty;
	var configSession = ConfigurationManager.GetSection(sessionName) as System.Collections.Specialized.NameValueCollection;
	if (configSession != null)
	{
		result = configSession[keyName];
	}
	return result;
}

protected void Page_Load(object sender, EventArgs e)
{
	//取得舊的設定值 1, 2
	string myOldSessionName = "MyOldSettings";
	Response.Write("<hr>MyOldSettings<br/>");
	Response.Write(string.Format("Old Key:1, Value:{0} <br/>", GetConfigSettingValue(myOldSessionName, "1")));
	Response.Write(string.Format("Old Key:2, Value:{0} <br/>", GetConfigSettingValue(myOldSessionName, "2")));
	//取得新的設定值 1, 2, 3
	string myNewSessionName = "MyNewSettings";
	Response.Write("<hr>MyNewSettings<br/>");
	Response.Write(string.Format("New Key:1, Value:{0} <br/>", GetConfigSettingValue(myNewSessionName, "1")));
	Response.Write(string.Format("New Key:2, Value:{0} <br/>", GetConfigSettingValue(myNewSessionName, "2")));
	Response.Write(string.Format("New Key:3, Value:{0} <br/>", GetConfigSettingValue(myNewSessionName, "3")));
}

image

依結果來看,在 MyNewSettings_Ex.config 裡可以覆寫及擴充原本 configSession (key 1, 3)。

PS. AppSettingsSection 也可以轉成 NameValueCollection 哦!

 

參考資料

appSettings 項目 (一般設定結構描述)

Hi, 

亂馬客Blog已移到了 「亂馬客​ : Re:從零開始的軟體開發生活

請大家繼續支持 ^_^