[C#.NET] 載入自訂 Configuration Section
續上篇 http://www.dotblogs.com.tw/yc421206/archive/2015/06/20/151599.aspx
若你的參數檔來源並非App.config | Web.config,ConfigurationManager 另外提供了載入其他 Xml 檔案的功能,以 Open 前綴詞,直接看範例
如下範例:
- ConfigurationManager.OpenMappedMachineConfiguration 開啟一外部 Xml 檔案
- CreateDefault 建立了預設的 MySection 及 MySectionGroup 類別
- Configuration.Save 將建立的檔案儲存起來
public static Configuration LoadFile(string targetXmlPath, bool isCreateDefault = false) { var config = ConfigurationManager.OpenMappedMachineConfiguration(new ConfigurationFileMap(targetXmlPath)); if (isCreateDefault) { DefaultSettings(config); } return config; } private static void DefaultSettings(Configuration config) { var section = config.Sections["Section"]; if (section == null) { MySection mySection = new MySection(); mySection.Code = "9999"; mySection.Member.Id = 100; mySection.Member.Name = "Sys"; config.Sections.Add("Section", mySection); } var sectionGroup = config.SectionGroups["SectionGroup"]; if (sectionGroup == null) { sectionGroup = new MySectionGroup(); config.SectionGroups.Add("SectionGroup", sectionGroup); var mySection1 = new MySection() { Code = "1", Member = new MemberElement() { Id = 1, Name = "yao1" } }; var mySection2 = new MySection() { Code = "2", Member = new MemberElement() { Id = 2, Name = "yao2" } }; sectionGroup.Sections.Add("Section1", mySection1); sectionGroup.Sections.Add("Section2", mySection2); } config.Save(ConfigurationSaveMode.Minimal); }
完整範例如下:
調用端程式碼如下:
- App1.config:copy always 必須是一個標準的 Xml 內容格式,我已經在測試專案建立了該檔案,並將它輸出到bin
- ConfigurationManager 裡面已經包含了 App.config 的Section,App.config 最後會輸出成 UnitTestProject1.dll.config
[TestMethod] public void LoadFile_CreateDefault_TestMethod() { var filePath = Directory.GetCurrentDirectory() + "\\" + "App1.config"; MySection.LoadFile(filePath, true); var section = (MySection)ConfigurationManager.GetSection("Section"); var mySection = (MySection)ConfigurationManager.GetSection("MySection"); Assert.AreEqual("9999", section.Code); Assert.AreEqual(100, section.Member.Id); Assert.AreEqual("Sys", section.Member.Name); Assert.AreEqual("23", mySection.Code); Assert.AreEqual(2, mySection.Member.Id); Assert.AreEqual("余小章", mySection.Member.Name); }
最後產生完整的 Xml 內容如下
<?xml version="1.0" encoding="utf-8" ?> <configuration> <configSections> <section name="Section" type="Simple.CustomConfiguration.MySection, Simple.CustomConfiguration, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" /> <sectionGroup name="SectionGroup" type="Simple.CustomConfiguration.MySectionGroup, Simple.CustomConfiguration, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" > <section name="Section1" type="Simple.CustomConfiguration.MySection, Simple.CustomConfiguration, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" /> <section name="Section2" type="Simple.CustomConfiguration.MySection, Simple.CustomConfiguration, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" /> </sectionGroup> </configSections> <Section Code="9999"> <Member Id="100" Name="Sys" /> </Section> <SectionGroup> <Section1 Code="1"> <Member Id="1" Name="yao1" /> </Section1> <Section2 Code="2"> <Member Name="yao2" /> </Section2> </SectionGroup> </configuration>
這裡衍生出一個問題
若相同的 *.config 有相同的 Section ,ConfigurationManager 會如何處理?
我在測試專案加入 App2.config:copy always,並建立與 App.config 相同的區段 MySection,Code 設為 36
測試結果 Code 並非 36,表示 ConfigurationManager 在碰到重覆的 Section 會以 App.config 的為主
[TestMethod] public void LoadFile_TestMethod() { var filePath = Directory.GetCurrentDirectory() + "\\" + "App2.config"; var mySection = (MySection)ConfigurationManager.GetSection("MySection"); MySection.LoadFile(filePath, false); Assert.AreEqual("36", mySection.Code); }
完整測試程式碼如下:
本文出自:http://www.dotblogs.com.tw/yc421206/archive/2015/06/20/151602.aspx
專案位置:https://dotblogsamples.codeplex.com/SourceControl/latest#Simple.CustomConfiguration/
若有謬誤,煩請告知,新手發帖請多包涵
Microsoft MVP Award 2010~2017 C# 第四季
Microsoft MVP Award 2018~2022 .NET