[Config] 客製化 Section (範例)
業務需求:功能權限, 每一個人會有多個角色, 各角色都有其可使用的功能, 功能在設計時是依其層級給予不同的按鍵.
技術需求:寫在設定檔 web.config or app.config, 且獨立自己section, 不要與AppConfigs參雜, 增加維護性.
技術限制:.NET Framework 2.0
步驟1:先把 xml設計好
(1) Domain data
<roles lockAllElementsExcept="role">
<role>
<clear />
<add name="R001" description="角色1">
<func>
<add name="F001" description="功能1" levels="1,0,0,0">
</add>
</func>
</add>
<add name="R002" description="角色2" />
</role>
</roles>
</roleModule>
(2) Custom Section
<section name="roles"
type="RoleModuleLib.RolesConfigSection, RoleModuleLib"
allowDefinition="Everywhere"
allowExeDefinition="MachineToApplication"
restartOnExternalChanges="true" />
</sectionGroup>
步驟2:開始寫Code
將Xml 裡的元素轉為物件.
根元素有:roles --> ConfigurationSection
子元素共有:func, role –> ConfigurationElementCollection, ConfigurationElement
因為System.Configuration 已經做了mapping的動作,
所以只要把
(1) 屬性
如: 元素中的子集合
/// 角色集合
/// /configuration/roleModule/roles/role
/// </summary>
[ConfigurationProperty("role", IsDefaultCollection = false)]
[ConfigurationCollection(typeof(RolesConfigCollection),
AddItemName = "add",
ClearItemsName = "clear",
RemoveItemName = "remove")]
public RolesConfigCollection Role {
get {
return (RolesConfigCollection)this["role"];
}
}
如: 元素中的基本型別
/// 角色名稱, 鍵值
/// </summary>
[ConfigurationProperty("name",IsRequired = true,IsKey = true)]
public string Name {
get {
return (string)this["name"];
}
set {
this["name"] = value;
}
}
(2) 實作ConfigurationElementCollection
protected override object GetElementKey(ConfigurationElement element)
public FuncConfigElement this[int index]
new public FuncConfigElement this[string Name]
其它就看原始碼下載: RoleModule.rar囉!! 內含MSDN sample code(ConfigurationElementCollection 類別)
Tip:在撰寫Code時, 本來我是先下而上, 結果不知道怎麼寫UT Code, 後來改為由上而下.
參考:
菜鳥工程師:讀取自訂Section區段 (未採用, 因為MSDN: 這是.net 1.0, 1.1的方案)
Sadish Kumar.V:Customizing SectionGroups and Sections in Web.config
小朱隨手寫:[ASP.NET]撰寫自己的 Configuration 區段 Part 1 , 2 , 3 (強力推薦 !! 必看)
MSDN:HOW TO:使用 ConfigurationSection 建立自訂組態區段 ; ConfigurationElementCollection 類別