[Config] 客製化 Section (範例)

[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 類別