1. 前言
.NET framework為電腦配置,應用程式配置和安全等資訊定義了一組標準設定檔,這些設定檔的記憶體映射及存取由Configuration程式集支援。
對於某些大型應用系統及專業領域軟體而言,配置資訊的編製和維護是一件複雜的事情。前陣子因為工作關係,藉助Configuration程式集,設計了一個簡單的定義配置資訊結構的模型(簡單得不能稱為架構)和維護工具。雖然由於換工作而沒有用上,不過在我看來還是有其實用價值的。因此將文檔整理了一下,有需要的朋友可依此應用。
本文介紹如何使用此模型和工具。
有關Configuraion程式集,請參考MSDN,尤其是關於建立自訂配置節等文。我對Configuration的總結陳述於《.NET Framework Configuration總結》。
有關此模型和工具的設計思路請參考《一個WinForm程式配置資訊的簡單設計和維護工具——設計說明》。
:https://sourceforge.net/projects/yedaoqproject/files/YedaoqConfiguration/YedaoqConfiguration-Release.rar/download
2. 概述
2.1 能夠協助你做什嗎?
此模型和工具旨在協助開發人員建立結構合理的配置資訊結構、提高使用效率,並降低維護成本。
1. 協助構造樹狀的層次配置結構。
2. 自動將代碼定義的配置結構同步到設定檔。
3. 自動將設定檔中資料讀取到記憶體,對記憶體資料的更改亦會自動儲存至設定檔。
4. 對配置資訊的訪問可使用編輯器的智能感知,無需使用關鍵字字串。
5. 提供工具來編輯向各個客戶提供的初始配置資料。
此模型和工具圍繞以下三個方面來設計:
1. 定義結構清晰、層次豐富的配置結構。
2. 使配置資訊易於訪問。
3. 屏蔽檔案操作。
2.2 在Configuration的基礎上,做了什嗎?
此模型由Configuration程式集的部分擴充而成,並將原Configuration程式集的使用介面作了部分封裝,使其使用流程更加簡化。
1. Configuration對配置資訊的存取以設定檔為單位(映射為Configuration對象)。此模型提供了AppConfiguration,使整個系統的所有配置資訊(可分散儲存於多個設定檔)在記憶體中形成一個整體結構。這有利於配置資訊的使用,也使設定檔對使用者更加透明。
2. 對Configuration相互關聯類型的一些限制和安全性問題作了處理。使定義配置結構更為簡單。
3. 提供了一個介面原型IAppConfigurationProvider,供使用者實現來提供對多套設定檔的枚舉和切換功能。
4. 提供了一個工具,用於同步設定檔的結構和編輯設定檔的內容。
3. 使用指南
3.1 一般概念
配置資訊樹:由AppConfiguration、ConfigurationSection和ConfigurationSectionGroup定義出的樹狀的配置資訊結構,以AppConfiguration為根節點。必須用AppConfiguration來定義根節點,並且不能AppConfiguration不能用於定義其它節點。ConfigurationSectionGroup是樹的非葉子節點,用於連結父節點和子組(段)節點;ConfigurationSection為樹的葉子節點,其中包含一組配置資料。
頂層配置組:直接定義在AppConfiguration中的配置組。頂層配置組相較普通的子配置組有所不同,它實際上是一個設定檔中的最外層配置組,只是出於整體性的考慮,組織到AppConfiguration下。擷取頂層配置組不僅需要名稱關鍵字,還需要檔案名稱等資訊。這些資訊應封裝到IConfigurationUnitInfo對象中傳遞給AppConfiguration索引器。
配置範圍:微軟為配置資訊劃分了三個範圍,電腦、應用程式和使用者。此模型限定於應用程式範圍內,因此包含後兩個範圍。範圍的概念一般用於決定設定檔的位置(應用程式定義域的配置資訊一般存放於安裝目錄下,使用者域的配置資訊一般存放到My Documents中),這也是ClientInfo中要提供兩個目錄欄位的原因。
3.2 類型簡介
程式集: YedaoqConfiguration.dll
命名空間:YedaoqConfiguration
類型 |
說明 |
AppConfiguration |
配置資訊結構根節點的基類,提供索引器用於擷取頂層配置組。 |
AppConfigurationProviderAttribute |
用於標記AppConfigurationProvider的屬性,工具通過此屬性來從程式集中尋找AppConfigurationProvider。 |
ClientInfo |
IClientInfo的基礎實現,用於儲存客戶資訊(及其設定檔所在目錄資訊)。 |
ConfigurationHelper |
提供擷取配置段(組)、反射等公用邏輯。 |
ConfigurationObjectManager |
將設定檔映射為Configuration對象並管理Configuration對象,供AppConfiguration使用。 |
ConfigurationSectionGroupInfo |
儲存頂層配置組資訊的類。 |
ConfigurationSectionInfo |
儲存頂層配置段資訊的類。 |
ConfigurationUnitBase |
ConfigurationSectionGroupInfo和ConfigurationSectionInfo的基類,描述頂層登錄區的資訊。 |
EnumConfigDomain |
用於描述頂層配置組的範圍(使用者域、應用程式定義域),此概念源自微軟。 |
ExConfigurationSection |
繼承自ConfigurationSection並實現了ICustomTypeDescriptor,任何自訂ConfigurationSection應以此為基類。 |
IAppConfiguration |
配置資訊結構根節點的介面,實現者應繼承AppConfiguration。 |
IAppConfigurationProvider |
枚舉使用者並向使用者提供IAppConfiguration的介面。 |
IClientInfo |
ClientInfo的實現介面。 |
IConfigurationObjectManager |
ConfigurationObjectManager的實現介面。 |
IConfigurationUnitInfo |
ConfigurationUnitBase的實現介面。 |
3.3 使用此模型改造你的應用程式,並藉助工具來維護配置資訊
要使用此模型和工具,必須做以下工作:
1. 使用AppConfiguration、ConfigurationSection、ConfigurationSectionGroup定義好配置資訊結構模型;
2. 實現一個IAppConfigurationProvider。
3.3.1 定義配置資訊結構模型
使用聲明性模型建立好所有自訂ConfigurationSection和ConfigurationSectionGroup,其中自訂ConfigurationSection應從ExConfigurationSection繼承,否則維護工具顯示的列表中將包含冗餘資訊。有關聲明性模型請參見MSDN有關自訂配置節的文章。
從AppConfiguration建立一個衍生類別,在其中定義頂層配置組。
樣本請參考程式Test工程中以下類:ConfigurationSectionA、ConfigurationSectionB、ConfigurationSectionGroupTest、TestAppConfiguration。
3.3.2 實現
IAppConfigurationProvider
IAppConfigurationProvider是枚舉客戶和擷取客戶配置的介面,應用程式應自主實現有關的邏輯。IAppConfigurationProvider的實作類別必須:
1. 帶有無參建構函式。
2. 使用AppConfigurationProviderAttribute屬性修飾。
維護工具將使用此介面來擷取客戶列表和每個客戶的AppConfiguration資料,它使用此介面的流程為:
圖片。
作為一個樣本,假定我們的應用程式的配置資訊存放在Config子目錄下。有數個客戶,每個客戶的設定檔放在Config的一個子目錄中,這些子目錄的名稱與客戶名稱相同。那麼,可以這樣這樣實現IAppConfigurationProvider:
見程式Test工程以下類:TestAppConfigurationProvider。
3.3.3 ConfigurationModifier的使用
將ConfigurationModifier.exe放置到應用程式目錄下,啟用後,此工具將搜尋目錄下的所有程式集,尋找帶有AppConfigurationProviderAttribute屬性的類。若找到,將擷取客戶列表顯示到左上方的列表框中,從中選擇要編輯其配置資訊的客戶,在左側TreeView中將顯示配置資訊樹,選中葉子節點後,可在右側PropertyGrid中編輯自訂ConfigurationSection中的各個配置項。
3.3.4 來源程式的編譯
來源程式:https://yedaoqproject.svn.sourceforge.net/svnroot/yedaoqproject/YedaoqConfiguration
編譯前,請下載另一個依賴程式集,並引用到YedaoqConfiguration和ConfigurationModifier項目中。
該依賴程式集位置為:https://sourceforge.net/projects/yedaoqproject/files/MySolution/CommonLibrary.dll/download