[ASP.NET]撰寫自己的 Configuration 區段 Part 3: 自訂組態集合

經過Part 1 和 Part 2 的試練以後,我想你應該已經有一個自己的 Configuration 系統了,而且也用的很開心,終於可以擺脫掉一大堆 appSettings 的噩夢了,而且只要修改 Web.config 的區段就可以變更程式的設定值。但用久了總是會不太對勁,因為目前為止,這些區段都只能獨立存在,而且只有一個。這時可能就會回想以前 appSettings 的好,因為它可以利用 來動態增加項目,不過,這個在你自己的 Configuration 中,其實也是可以做到的。

經過Part 1Part 2 的試練以後,我想你應該已經有一個自己的 Configuration 系統了,而且也用的很開心,終於可以擺脫掉一大堆 appSettings 的噩夢了,而且只要修改 Web.config 的區段就可以變更程式的設定值。但用久了總是會不太對勁,因為目前為止,這些區段都只能獨立存在,而且只有一個。這時可能就會回想以前 appSettings 的好,因為它可以利用 <add> 來動態增加項目,不過,這個在你自己的 Configuration 中,其實也是可以做到的。

讓我們回顧一下 appSettings 的時光,它是長這個樣子的:

它可以利用 <add> 來加入許多的標記資料,然後透過 Configuration Framework 去讀取它,再利用程式中的 ConfigurationManager.AppSettings 來存取,而這種類型的設定區段,在 Configuration Framework 中被稱為 Configuration Element Collection,用來裝載 Configuration Element 的一個集合類別,而 Configuration Element 就代表一個組態檔元素,由 ConfigurationElement 提供基礎架構,集合物件則是用 ConfigurationElementCollection 提供。

也就是說,你可以在程式中加入一個自己的 ConfigurationElement 以及 ConfigurationElementCollection,就可以做到有如 AppSettings 的能力了。怎麼做呢,很簡單,首先先建一個自己的 ConfigurationElement 類別,如下列程式碼:

接著,再建立一個自己的 ConfigurationElementCollection,在這裡由於要處理覆寫 ConfigurationElementCollection 以及實作部份必要行為的關係,程式碼會比較多,但基本上只要改幾個地方即可:

上列程式碼中,會需要依自己需求變動的,只有在有自訂的 ConfigurationElement(如範例中的 MyDataItemElement)出現的部份才需要改為自己的 ConfigurationElement 類別,而且在 GetElementKey() 中,要回傳一個唯一的識別資料(在本例中是 Caption,所以在組態檔中的 Caption 不能重覆),如此 Configuration Framework 才可以正確識別指定的 ConfigurationElement 元素。

最後,在你的 Section 中將它登錄起來,就可以在 Web.config 中使用了:

其中,ConfigurationCollectionAttribute設定這個ConfigurationElementCollection的相關參數,除了自訂的 ConfigurationElementCollection 型別外,最有意思的應該是 AddItemName, ClearItemsName 以及 RemoveItemName 三個屬性了,它分別代表了 add, clear 與 remove 三個元素,你可以將 add 改成 addUrl,如此在 Web.config 中就要用 <addUrl> 來表示,而不是 <add>。相同的道理,也可以適用在 clear 和 remove 上。

接著,你就可以在 Web.config 中設定你的自訂 ConfigurationElementCollection 以及 ConfigurationElement 資料了(mySection 必須要先使用 section註冊在 <configSection> 區段中,Part 1 中有說明):

而在程式中的存取方法是: