博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
在Web.config或App.config中的添加自定义配置
阅读量:6500 次
发布时间:2019-06-24

本文共 5903 字,大约阅读时间需要 19 分钟。

.Net中的System.Configuration命名空间为我们在web.config或者app.config中自定义配置提供了完美的支持。最近看到一些项目中还在自定义xml文件做程序的配置,所以忍不住写一篇用系统自定义配置的随笔了。

如果你已经对自定义配置了如指掌,请忽略这篇文章。

言归正传,我们先来看一个最简单的自定义配置

在配置文件中使用自定义配置,需要在configSections中添加一个section元素,并制定此section元素对应的类型和名字。然后再在configuration根节点下面添加此自定义配置,如上例中的simple节点。simple节点只有两个整形数的属性maxValue和minValue。

要在程序中使用自定义配置我们还需要实现存取这个配置块的类型,一般需要做如下三件事:

1. 定义类型从System.Configuration.ConfigurationSection继承
2. 定义配置类的属性,这些属性需要用ConfigurationProperty特性修饰,并制定属性在配置节中的名称和其他一些限制信息
3. 通过基类的string索引器实现属性的get ,set

非常简单和自然,如下是上面配置类的实现:

public class SimpleSection:System.Configuration.ConfigurationSection{    [ConfigurationProperty("maxValue",IsRequired=false,DefaultValue=Int32.MaxValue)]    public int MaxValue    {        get        {            return  (int)base["maxValue"];        }        set        {            base["maxValue"] = value;        }    }     [ConfigurationProperty("minValue",IsRequired=false,DefaultValue=1)]    public int MinValue    {        get { return (int) base["minValue"];}        set { base["minValue"] = value; }    }      [ConfigurationProperty("enabled",IsRequired=false,DefaultValue=true)]    public bool Enable    {        get        {            return (bool)base["enabled"];        }        set        {            base["enabled"] = value;        }    }}

这样子一个简单的配置类就完成了,怎么在程序中使用这个配置呢?需要使用ConfigurationManager类(要引用System.configuration.dll这个dll只有在.Net2.0之后的版本中才有)的GetSection方法获得配置就可以了。如下代码:

SimpleSection simple = ConfigurationManager.GetSection("simple") as SimpleSection;Console.WriteLine("simple minValue={0} maxValue = {1}",simple.MinValue,simple.MaxValue);

这个配置类太过简陋了,可能有时候我们还需要更复杂的构造,比如在配置类中使用类表示一组数据,下面我们看一个稍微复杂一点的自定义配置

这个配置的名字是complex,他有一个属性height,他的节点内还有一个child元素这个元素有两个属性firstName和lastName;对于这个内嵌的节点该如何实现呢?首先我们需要定义一个类,要从ConfigurationElement类继承,然后再用和SimpleSection类似的方法定义一些用ConfigurationProperty特性修饰的属性就可以了,当然属性值的get,set也要使用基类的索引器。如下实现:

public class ComplexSection : ConfigurationSection{    [ConfigurationProperty("height", IsRequired = true)]    public int Height    {        get        {            return (int)base["height"];        }        set        {            base["height"] = value;        }    }     [ConfigurationProperty("child", IsDefaultCollection = false)]    public ChildSection Child    {        get        {            return (ChildSection)base["child"];        }        set        {            base["child"] = value;        }    }} public class ChildSection : ConfigurationElement{    [ConfigurationProperty("firstName", IsRequired = true, IsKey = true)]    public string FirstName    {        get        {            return (string)base["firstName"];        }        set        {            base["firstName"] = value;        }    }     [ConfigurationProperty("lastName", IsRequired = true)]    public string LastName    {        get        {            return (string)base["lastName"];        }        set        {            base["lastName"] = value;        }    }}

还有稍微再复杂一点的情况,我们可能要在配置中配置一组相同类型的节点,也就是一组节点的集合。如下面的配置:

请看children节点,它就是一个集合类,在它里面定义了一组add元素,也可以有remove节点把已经添进去的配置去掉。

要使用自定义节点集合需要从ConfigurationElementCollection类继承一个自定义类,然后要实现此类GetElementKey(ConfigurationElement element)和ConfigurationElement CreateNewElement()两个方法;为了方便的访问子节点可以在这个类里面定义只读的索引器。请看下面的实现

public class Children : ConfigurationElementCollection{    protected override object GetElementKey(ConfigurationElement element)    {        return ((ChildSection)element).FirstName;    }     protected override ConfigurationElement CreateNewElement()    {        return new ChildSection();    }     public ChildSection this[int i]    {        get        {            return (ChildSection)base.BaseGet(i);        }    }     public ChildSection this[string key]    {        get        {            return (ChildSection)base.BaseGet(key);        }    } }

当然要使用此集合类我们必须在Complex类中添加一个此集合类的属性,并要指定集合类的元素类型等属性,如下:

[ConfigurationProperty("children", IsDefaultCollection = false)]    [ConfigurationCollection(typeof(ChildSection), CollectionType = ConfigurationElementCollectionType.AddRemoveClearMap, RemoveItemName = "remove")]    public Children Children    {        get        {            return (Children)base["children"];        }        set        {            base["children"] = value;        }}

我们会经常用到类似appSettings配置节的键值对的构造,这时候我们就不必再自己实现了,我们可以直接使用现有的System.Configuration.NameValueConfigurationCollection类来定义一个自定义的键值对。可以在Complex类中定义如下属性

[ConfigurationProperty("NVs", IsDefaultCollection = false)]    public System.Configuration.NameValueConfigurationCollection NVs    {        get        {            return (NameValueConfigurationCollection)base["NVs"];        }        set        {            base["NVs"] = value;        }}

然后在配置文件的complex节中添加键值对配置

到这儿已经基本上可以满足所有的配置需求了。不过还有一点更大但是不复杂的概念,就是sectionGroup。我们可以自定义SectionGroup,然后在sectionGroup中配置多个section;分组对于大的应用程序是很有意义的。

如下配置,配置了一个包含simple和一个complex两个section的sectionGroup

为了方便的存取sectionGroup中的section我们可以实现一个继承自System.Configuration.ConfigurationSectionGroup类的自定义类。实现很简单,就是通过基类的Sections[“sectionName”]索引器返回Section。如下:

public class SampleSectionGroup : System.Configuration.ConfigurationSectionGroup{    public SimpleSection Simple    {        get        {            return (SimpleSection)base.Sections["simple"];        }    }     public ComplexSection Complex    {        get        {            return (ComplexSection)base.Sections["complex"];        }    }}

 

转载地址:http://dqvyo.baihongyu.com/

你可能感兴趣的文章
那些按烂的Linux命令集合贴
查看>>
MySQL 语句整理 2019-5-3
查看>>
html5新标签使用
查看>>
compass安装使用960 Grid System
查看>>
关于小数的精确运算
查看>>
20175203 2018-2019 实验五《网络编程与安全》
查看>>
Eureka服务注册中心
查看>>
轻松记账工程冲刺第二阶段10
查看>>
分离导航模块
查看>>
Lighttpd1.4.20源代码分析 笔记 状态机之错误处理和连接关闭
查看>>
php代码中使用换行及(\n或\r\n和br)的应用
查看>>
高考估分查分选志愿一键搞定_支付宝又操办了件人生大事
查看>>
HTML中的form表单有一个关键属性 enctype
查看>>
LeetCode-135-Candy
查看>>
制作RPM包
查看>>
beego数据输出
查看>>
DecimalFormat
查看>>
如何在同一系统里同时启动多个Tomcat
查看>>
Unix / 类 Unix shell 中有哪些很酷很冷门很少用很有用的命令?(转)
查看>>
java显示本地磁盘所有盘符,显示桌面路径
查看>>