使用.NET Framework的配置文件app.config
- <configuration>
- <appSettings>
- <add key="MyConfigString" value="Test Config Data"/>
- </appSettings>
- </configuration>
- public class AppSettingConfig
- {
- public string resultValue;
- public AppSettingConfig()
- {
- this.resultValue = ConfigurationManager.AppSettings["MyConfigString"].ToString();
- }
- }
- [TestMethod]
- public void TestAppSettingConfigNode()
- {
- AppSettingConfig appCon = new AppSettingConfig();
- Assert.AreEqual("Test Config Data", appCon.resultValue);
- }
- 没有问题!
- 我们加个Section来看看如何访问:
- <configuration>
- <configSections>
- <sectionGroup name="MySectionGroup">
- <section name="MyFirstSection" type="System.Configuration.DictionarySectionHandler"/>
- <section name="MySecondSection" type="System.Configuration.DictionarySectionHandler"/>
- </sectionGroup>
- </configSections>
- <MySectionGroup>
- <MyFirstSection>
- <add key="First" value="First Section"/>
- </MyFirstSection>
- <MySecondSection>
- <add key="Second" value="Second Section"/>
- </MySecondSection>
- </MySectionGroup>
- </configuration>
- 注意我们在section的type中给出了System.Configuration.DictionarySectionHandler,这也限制了我们在具体的ConfigurationElement中只能使用<add key=”” value=””/>的形式,使得我们GetSection()方法返回的是一个IDictory对象,我们可以根据Key来取得相应的值
- public class SectionConfig
- {
- public string resultValue;
- public SectionConfig()
- {
- System.Configuration.Configuration config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
- IDictionary dic = ConfigurationManager.GetSection("MySectionGroup/MySecondSection") as IDictionary;
- this.resultValue = dic["Second"].ToString();
- }
- }
- [TestMethod]
- public void TestSectionGroupConfigNode()
- {
- SectionConfig sc = new SectionConfig();
- Assert.AreEqual("First Section", sc.resultValue);
- }
- 还是没问题。
- 2. 中级使用
- .NET支持对上述提到的configuration类进行扩展,我们可以定义自己的Section。
- 继承自基类System.Configuration.ConfigurationSection,ConfigurationSection已经提供了索引器用来获取设置数据。
- 在类中加上ConfigurationProperty属性来定义Section中的Element:
- public class CustomSection:System.Configuration.ConfigurationSection
- {
- [ConfigurationProperty("sectionId", IsRequired=true, IsKey=true)]
- public int SectionId {
- get { return (int)base["sectionId"]; }
- set { base["sectionId"] = value; }
- }
- [ConfigurationProperty("sectionValue", IsRequired = false)]
- public string SectionValue {
- get { return base["sectionValue"].ToString(); }
- set { base["sectionValue"] = value; }
- }
- }
- 操作此Section,我们将其动态加入app.config中,并读出来:
- public class CustomSectionBroker
- {
- private CustomSection customSection = null;
- public void InsertCustomSection()
- {
- customSection = new CustomSection();
- customSection.SectionId = ;
- customSection.SectionValue = "The First Value";
- System.Configuration.Configuration config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
- config.Sections.Add("CustomSection", customSection);
- config.Save(ConfigurationSaveMode.Minimal);
- }
- public int GetCustomSectionID()
- {
- System.Configuration.Configuration config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
- CustomSection cs = config.GetSection("CustomSection") as CustomSection;
- return cs.SectionId;
- }
- }
- [TestMethod]
- public void TestCustomSection()
- {
- CustomSectionBroker cb = new CustomSectionBroker();
- cb.InsertCustomSection();
- Assert.AreEqual(, cb.GetCustomSectionID());
- }
- 可以看下现在app.config文件的变化:
- <configuration>
- <configSections>
- <section name="CustomSection" type="Tonnie.Configuration.Library.CustomSection, Tonnie.Configuration.Library, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" />
- <sectionGroup name="MySectionGroup">
- <section name="MyFirstSection" type="System.Configuration.DictionarySectionHandler"/>
- <section name="MySecondSection" type="System.Configuration.DictionarySectionHandler"/>
- </sectionGroup>
- </configSections>
- <CustomSection sectionId="" sectionValue="The First Value" />
- <MySectionGroup>
- <MyFirstSection>
- <add key="First" value="First Section"/>
- </MyFirstSection>
- <MySecondSection>
- <add key="Second" value="Second Section"/>
- </MySecondSection>
- </MySectionGroup>
- </configuration>
- public abstract class CustomSectionElementBase:System.Configuration.ConfigurationElement
- {
- [ConfigurationProperty("childId", IsRequired=true, IsKey=true)]
- public int ChildID
- {
- get{return (int)base["childId"];}
- set{base["childId"] = value;}
- }
- [ConfigurationProperty("childValue", IsRequired=true)]
- public string ChildValue
- {
- get{return base["childValue"].ToString();}
- set{base["childValue"] = value;}
- }
- }
- public class CustomSectionElementA:CustomSectionElementBase
- {
- public CustomSectionElementA()
- {
- base.ChildID = ;
- base.ChildValue = "ChildA";
- }
- }
- public class CustomSectionElementB:CustomSectionElementBase
- {
- public CustomSectionElementB()
- {
- base.ChildID = ;
- base.ChildValue = "ChildB";
- }
- }
- public class CustomSectionWithChildElement:System.Configuration.ConfigurationSection
- {
- private const string elementChildA = "childSectionA";
- private const string elementChildB = "childSectionB";
- [ConfigurationProperty(elementChildA, IsRequired=true, IsKey=true)]
- public CustomSectionElementA ChildSectionA {
- get { return base[elementChildA] as CustomSectionElementA; }
- set { base[elementChildA] = value; }
- }
- [ConfigurationProperty(elementChildB, IsRequired = true)]
- public CustomSectionElementB ChildSectionB {
- get { return base[elementChildB] as CustomSectionElementB; }
- set { base[elementChildB] = value; }
- }
- }
- public class CustomSectionWithChildElementBroker
- {
- private CustomSectionWithChildElement customSection = null;
- public void InsertCustomSection()
- {
- customSection = new CustomSectionWithChildElement();
- customSection.ChildSectionA = new CustomSectionElementA();
- customSection.ChildSectionB= new CustomSectionElementB();
- System.Configuration.Configuration config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
- config.Sections.Add("CustomSectionWithChildElement", customSection);
- config.Save(ConfigurationSaveMode.Minimal);
- }
- public int GetCustomSectionChildAID()
- {
- System.Configuration.Configuration config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
- CustomSectionWithChildElement cswe = config.GetSection("CustomSectionWithChildElement") as CustomSectionWithChildElement;
- return cswe.ChildSectionA.ChildID;
- }
- }
- 红色字体就是修改的地方了,将Property改成我们自定义类的形式.测试代码如下:
- [TestMethod]
- public void TestCustomSectionWithChildElement()
- {
- CustomSectionWithChildElementBroker cweb = new CustomSectionWithChildElementBroker();
- cweb.InsertCustomSection();
- Assert.AreEqual(, cweb.GetCustomSectionChildAID());
- }
看看运行后我们的app.config变成什么样子了:
- <configuration>
- <configSections>
- <section name="CustomSectionWithChildElement" type="Tonnie.Configuration.Library.CustomSectionWithChildElement, Tonnie.Configuration.Library, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" />
- <section name="CustomSection" type="Tonnie.Configuration.Library.CustomSection, Tonnie.Configuration.Library, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" />
- <sectionGroup name="MySectionGroup">
- <section name="MyFirstSection" type="System.Configuration.DictionarySectionHandler"/>
- <section name="MySecondSection" type="System.Configuration.DictionarySectionHandler"/>
- </sectionGroup>
- </configSections>
- <CustomSectionWithChildElement>
- <childSectionA childId="" childValue="ChildA" />
- <childSectionB childId="" childValue="ChildB" />
- </CustomSectionWithChildElement>
- <CustomSection sectionId="" sectionValue="The First Value" />
- <MySectionGroup>
- <MyFirstSection>
- <add key="First" value="First Section"/>
- </MyFirstSection>
- <MySecondSection>
- <add key="Second" value="Second Section"/>
- </MySecondSection>
- </MySectionGroup>
- </configuration>
cool,好像完成了我们的要求。
下面为我们的CustomSectionWithChildElement外面再加一层SectionGroup.
- public class CustomSectionGroup : System.Configuration.ConfigurationSectionGroup
- {
- [ConfigurationProperty("customSectionA", IsRequired = true, IsKey = true)]
- public CustomSectionWithChildElement SectionA
- {
- get { return base.Sections["customSectionA"] as CustomSectionWithChildElement; }
- set
- {
- this.Sections.Add("customSectionA", value);
- }
- }
- }
- public class CustomSectionGroupWithChildElementBroker
- {
- private CustomSectionWithChildElement customSection = null;
- public void InsertCustomSectionGroup()
- {
- customSection = new CustomSectionWithChildElement();
- customSection.ChildSectionA = new CustomSectionElementA();
- customSection.ChildSectionB= new CustomSectionElementB();
- CustomSectionGroup sectionGroup = new CustomSectionGroup();
- System.Configuration.Configuration config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
- if (config.GetSectionGroup("customSectionGroup") == null)
- config.SectionGroups.Add("customSectionGroup",sectionGroup);
- sectionGroup.SectionA = customSection;
- config.Save(ConfigurationSaveMode.Minimal);
- }
- public int GetCustomSectionChildAID()
- {
- System.Configuration.Configuration config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
- CustomSectionWithChildElement cswe = config.GetSection("customSectionGroup/customSectionA") as CustomSectionWithChildElement;
- return cswe.ChildSectionA.ChildID;
- }
- }
- 测试一下:
- [TestMethod]
- public void TestCustomSectionGroupWithChildElement()
- {
- CustomSectionGroupWithChildElementBroker cweb = new CustomSectionGroupWithChildElementBroker();
- cweb.InsertCustomSectionGroup();
- Assert.AreEqual(, cweb.GetCustomSectionChildAID());
- }
- 没问题,看下现在的app.config,是不是更加结构化了:
- <configuration>
- <configSections>
- <sectionGroup name="MySectionGroup">
- <section name="MyFirstSection" type="System.Configuration.DictionarySectionHandler"/>
- <section name="MySecondSection" type="System.Configuration.DictionarySectionHandler"/>
- </sectionGroup>
- <sectionGroup name="customSectionGroup" type="Tonnie.Configuration.Library.CustomSectionGroup, Tonnie.Configuration.Library, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" >
- <section name="customSectionA" type="Tonnie.Configuration.Library.CustomSectionWithChildElement, Tonnie.Configuration.Library, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" />
- </sectionGroup>
- </configSections>
- <MySectionGroup>
- <MyFirstSection>
- <add key="First" value="First Section"/>
- </MyFirstSection>
- <MySecondSection>
- <add key="Second" value="Second Section"/>
- </MySecondSection>
- </MySectionGroup>
- <customSectionGroup>
- <customSectionA>
- <childSectionA childId="" childValue="ChildA" />
- <childSectionB childId="" childValue="ChildB" />
- </customSectionA>
- </customSectionGroup>
- </configuration>
- 3 高级使用
- 到目前为止可能大家对app.config有了一定的认识了,我们自己可以不断的去扩展.NET Framework提供给我们的类,从SectionGroup,Section,ElementCollection,Element 从上自下的一级一级的组装成符合工程化项目配置文件需要的形式。当遇到可能配置元素的类型属性差不多时,可以抽象出一个base类来。比如可以抽象出Section这一层面的base类,或者ElementCollection,Element这一层的抽象类(可以是抽象的泛型类)来。同时增加泛型来更好的支持扩展。
使用.NET Framework的配置文件app.config的更多相关文章
- 一步一步教你玩转.NET Framework的配置文件app.config
转自https://www.cnblogs.com/tonnie/archive/2010/12/17/appconfig.html 在一般的项目中,为了使你的代码更加灵活,更方便调整,减少不必要的h ...
- 配置文件App.config的使用以及Readonly与Const的对比
以前我们学习的时候都把连接数据库的连接字符串写在一个类中,因为我们的数据库都在自己电脑上.如果更换数据库地址,需要更改这个类,然后重新编译才可以连接到数据库.现在我们需要将连接字符串当道一个文件中,然 ...
- C#的配置文件App.config使用总结 - 转
http://blog.csdn.net/celte/article/details/9749389 首先,先说明,我使用的app.config 配置文件的格式如下: <?xml version ...
- winform程序读取和改写配置文件App.config元素的值
winform程序读取和改写配置文件App.config元素的值 2016-05-16 17:49 by newbirth, 2412 阅读, 0 评论, 收藏, 编辑 1 2 3 4 5 6 7 & ...
- C#的配置文件App.config使用总结
应用程序配置文件是标准的 XML 文件,XML 标记和属性是区分大小写的.它是可以按需要更改的,开发人员可以使用配置文件来更改设置,而不必重编译应用程序.配置文件的根节点是configuration. ...
- 配置文件——App.config文件读取和修改
作为普通的xml文件读取的话,首先就要知道怎么寻找文件的路径.我们知道一般配置文件就在跟可执行exe文件在同一目录下,且仅仅在名称后面添加了一个.config 因此,可以用Application.Ex ...
- C#中怎样获取默认配置文件App.config中配置的键值对内容
场景 在新建一个程序后,项目中会有一个默认配置文件App.config 一般会将一些配置文件信息,比如连接数据库的字符串等信息存在此配置文件中. 怎样在代码中获取自己配置的键值对信息. 注: 博客主页 ...
- C#----操作应用程序配置文件App.config
对配置文件的一些疑问: 在应用程序的目录下,有两处值得注意的地方,一个是应用程序根目录下的App.config文件,和bin\debug\name.exe.config 或者 bin\Release\ ...
- 通过读取配置文件App.config来获取数据库连接字符串
有两种方式://通过读取配置文件来获取连接字符串 第一种方式: App.config 文件的格式: <?xml version="1.0" encoding="ut ...
随机推荐
- NET-SNMP开发——日志输出
NET-SNMP开发——日志输出 net-snmp的日志输出功能是很强大的,与日志输出相关函数声明在net-snmp-5.7.3\include\net-snmp\library\snmp_loggi ...
- leetcode:32 最长有效括号
题目: 给一个包含了'(' 和 ')'的字符串,求出其中最长有效括号的长度. 做题情况:自己做出来,但做了较长的时间. 思路:可以算得穷举法的时间复杂度为O(n^3).虽然这题求的是最长的长度,但是 ...
- Activity中UI框架基本概念
Activity中UI框架基本概念 Activity 是应用程序的基本组成部分,提供了可视的界面,UI容器, 与用户进行交互: 具体Acitivity是怎么样显示这些事视图元素以及响应事件交互的. 一 ...
- AFNetworking 2.5.0版本的使用
http://www.mamicode.com/info-detail-477899.html AFNetworking 2.5.0版本的使用 http://afnetworking.com/ htt ...
- JQuery 遍历 - prev() 方法
http://www.w3school.com.cn/jquery/traversing_prev.asp http://www.w3school.com.cn/jquery/jquery_ref_t ...
- 《oracle每天一练》Oracle之物化视图
相关帖子思考和跟踪 本文转自Ronger 物化视图是一种特殊的物理表,“物化”(Materialized)视图是相对普通视图而言的.普通视图是虚拟表,应用的局限性大,任何对视图的查询,Oracle都实 ...
- poj 1847( floyd && spfa )
http://poj.org/problem?id=1847 一个水题,用来熟悉熟悉spfa和floyd的. 题意:有m条的铁路,要从x,到y, 之后分别就是条铁路与其他铁路的交点.第一个输入的为有n ...
- Unity3d 扩展自定义类Inspector
public class MyClass : MonoBehaviour { public int A; // Use this for initialization void Start () { ...
- redis与memcache区别总结
2015年9月2日 14:04:19 总会被问到两者的区别, 在这里总结下: redis 有内置的多种数据结构, list(可用于实现小型队列), hash, set, zset...; memcac ...
- code vs1436 孪生素数 2(数论+素数的判定)
1436 孪生素数 2 时间限制: 2 s 空间限制: 1000 KB 题目等级 : 白银 Silver 题解 查看运行结果 题目描述 Description 如m=100,n=6 则 ...