在Web.config或App.config中的添加自定义配置

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

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

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

<?xml version="1.0" encoding="utf-8" ?>

<configuration>

  <configSections>

    <section name="simple" type="ConfigExample.Configuration.SimpleSection,ConfigExample"/>

  </configSections>

  <simple maxValue="20" minValue="1"></simple>

</configuration>

在配置文件中使用自定义配置,需要在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);

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

<?xml version="1.0" encoding="utf-8" ?>

<configuration>

  <configSections>

    <section name="complex" type="ConfigExample.Configuration.ComplexSection,ConfigExample"/>

  </configSections>

  <complex height="190">

    <child firstName="James" lastName="Bond"/>

  </complex>

</configuration>

这个配置的名字是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;

        }

    }

}

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

<?xml version="1.0" encoding="utf-8" ?>

<configuration>

  <configSections>

    <section name="complex" type="ConfigExample.Configuration.ComplexSection,ConfigExample"/>

  </configSections>

  <complex height="190">

    <child firstName="James" lastName="Bond"/>

 

    <children>

      <add firstName="Zhao" lastName="yukai"/>

      <add firstName="Lee" lastName="yukai"/>

      <remove firstName="Zhao"/>

    </children>

  </complex>

</configuration>

请看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节中添加键值对配置

<NVs>

    <add name="abc" value="123"/>

    <add name="abcd" value="12d3"/>

</NVs>

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

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

<?xml version="1.0" encoding="utf-8" ?>

<configuration>

  <configSections>

    <sectionGroup type="ConfigExample.Configuration.SampleSectionGroup,ConfigExample" name="sampleGroup">

      <section type="ConfigExample.Configuration.SimpleSection,ConfigExample" allowDefinition="Everywhere" name="simple" />

      <section type="ConfigExample.Configuration.ComplexSection,ConfigExample" allowDefinition="Everywhere" name="complex"/>

    </sectionGroup>

  </configSections>

  <sampleGroup>

    <simple maxValue="20" minValue="1">

    </simple>

 

    <complex height="190">

      <child firstName="James" lastName="Bond"/>

      <children>

        <add firstName="Zhao" lastName="yukai"/>

        <add firstName="Lee" lastName="yukai"/>

        <remove firstName="Zhao"/>

      </children>

  <NVs>

    <add name="abc" value="123"/>

    <add name="abcd" value="12d3"/>

  </NVs>

    </complex>

  </sampleGroup>

</configuration>

为了方便的存取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"];

        }

    }

}

需要注意的是SectionGroup不能使用ConfigurationManager.GetSection(string)方法来获得,要获得sectionGroup必须通过Configuration类的SectionGroups[string]索引器获得,如下示例代码:

SampleSectionGroup sample = (SampleSectionGroup)ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None).SectionGroups["sampleGroup"];

总结:

.Net framework给我们提供了一套很方便的配置库,我们只需要继承对应的类简单的配置一下就可以方便的使用在web.config或者app.config中配置的自定义节点了。

 

自定义配置文件节源码

来自:http://www.cnblogs.com/yukaizhao/archive/2011/12/02/net-web-config-costom-config-implement.html

时间: 2024-10-24 08:41:58

在Web.config或App.config中的添加自定义配置的相关文章

解决在Web.config或App.config中添加自定义配置的方法详解_实用技巧

.Net中的System.Configuration命名空间为我们在web.config或者app.config中自定义配置提供了完美的支持.最近看到一些项目中还在自定义xml文件做程序的配置,所以忍不住写一篇用系统自定义配置的随笔了.如果你已经对自定义配置了如指掌,请忽略这篇文章.言归正传,我们先来看一个最简单的自定义配置 复制代码 代码如下: <?xml version="1.0" encoding="utf-8" ?> <configura

Web.config 和 App.config 的区别分析_实用技巧

web.config是web应用程序的配置文件,为web应用程序提供相关配置.在你开发的web程序中,你可以为每一个文件夹建立一个web.config.app.config是桌面应用程序的配置文件.在vs.net中创建一个桌面应用程序工程并添加了应用程序配置文件时,它会自动命名为<appname>.exe.config,并且自动与你的程序进行关联. 不管是web.config,还是app.config,你都可以使用下面的方法获取appsetting节的值: System.Configurati

创建自定义配置节点(web.config和app.config都适用)

恼火!不小心点到全屏幕模式,刚写的东西全丢了!!从头再来!!! 无论是web程序.windows程序.windows service程序,配置文件都是少不了的.我们都习惯了将连接字符串放在ConnectionString节点中,将程序的设置放在appSetting节点中.配置文件的管理程序为我们提供了方便的管理方式,那么,我们如何自定义配置节点呢? 有两种方法,其一,继承IConfigurationSectionHandler,通过实现Create方法.这种方法的灵活度非常大,我们需要动手解析自

app.config文件-App.config读取文件失败问题

问题描述 App.config读取文件失败问题 直接上图吧 读取失败问题 App.config配置文件 读取代码 读取失败了 解决方案 又没人有人瞅 见啊, 大大神呢 解决方案二: 读取并修改App.config文件读取并修改App.config文件(转载)读取并修改App.config文件(转载) 解决方案三: 没人看见吗,我顶,顶,顶,顶 解决方案四: 已经解决了,应该写在UI层的,

C#项目中如何读取并修改App.config文件

本文简单介绍C#项目中读取并修改App.config文件的方法,AppConfig最重要的功能就是它将命令行选项和配置文件选项统一到一种数据结构中. 1. 向C#项目实例中的项目添加app.config文件: 右击C#项目实例中项目名称,选择"添加"→"添加新建项",在出现的"添加新项"对话框中,选择"添加应用程序配置文件":如果项目以前没有配置文件,则默认的文件名称为"app.config",单击&quo

网站安装打包 修改app.config[六]

在winform的安装工具中,少不免有一些配置文件要放到app.config去,于是修改也是成了一种需求! 无论是修改web.config还是app.config,普遍方式都有两种,用net自带封装的类,或是自定义xml操作. 可参考之前的一篇:网站安装打包 webconfig修改[三] 这里用的,还是以xml方式操作,比竟类都写了,就顺路用上了. 这里的操作方式和webconfig的差不多一个样:    string appConfigPath = startPath + "/XXX.exe.

C# WinForm程序App.Config数据库连接配置文件的使用过程

App.Config[应用程序配置文件],它其实就是一个标准的XML文件,不过.Net类库已经封装了读取这个文件的方法.可以很方便的使用.看下使用过程. 1.右键解决方案资源管理器中你的项目名,[添加]>[新建项],选择列表中的[应用程序配置文件],默认文件即是App.Config.确定. 2.打开App.Config,初始的XML代码为: <xml version="1.0" encoding="utf-8" > <configuratio

C# app.config

问题描述 app.config中可以写一些参数么?不运行程序,只修改app.config,就能按照新的参数执行程序?是只能写string类型的么? 解决方案 解决方案二:可以写section,例如http://www.cnblogs.com/yukaizhao/archive/2011/12/02/net-web-config-costom-config-implement.html解决方案三:app.config怎么用?解决方案四:引用2楼qq_28744297的回复: app.config怎

修改App.config中的数据库连接 ,才能运行,怎么修改?

问题描述 修改App.config中的数据库连接 ,才能运行,怎么修改? 我下了一个C#系统源码,点Debug中的exe运行不了,需要修改App.config中的数据库连接 ,请问要怎么修改? <?xml version="1.0" encoding="utf-8" ?> value="Data Source= .sql2005;Initial;Initial Catalog=DATA;User ID=sa;Password=sasasa&qu