首页 > 编程 > .NET > 正文

在.NET框架下使用自定义配置设置

2024-07-10 13:12:08
字体:
来源:转载
供稿:网友

.net框架通过基于xml的配置使配置设置驾轻就熟。它同时还提供了必要的方法,通过集合类(collection classes)访问这些设置。

通过一个静态的configurationsettings类可访问实际的配置数据。该类还提供了一个getconfig()方法,可向一个合适的集合返回一个对象。本文中,我将示范三种可用来访问和存储配置信息的方法。

应用配置数据存储在app.config文件,并由configsections节点定义。每一section都有一个type属性定义。这里我将讨论的3个类型为namevaluesectionhandler、singletagsectionhandler和dictionarysectionhandler。你可以用一个sectiongroup元素定义节组。以下是一个配置节定义的例子:

<section name="mycustomsection"
type="system.configuration.namevaluesectionhandler"/>

建议使用type="system.configuration.namevaluesectionhandler,system,version=1.0.3300.0,culture=neutral, publickeytoken=b77a5c561934e089"

节组是嵌入一个sectiongroup元素的独立配置节。以下是一个节组的例子:

<sectiongroup name="customgroup">
<section name="custom1"
type="system.configuration.namevaluesectionhandler"/>
<section name="custom2" type="system.configuration.namevaluesectionhandler"/>
</sectiongroup>

最后,你所指定的配置节将用于构造存储配置数据的自定义的xml节点。若要向配置节添加数据,只要将该配置节作为一个xml节点包含进去,并用add节点添加collection数据。下例为一个namevaluesectionhandler配置节:

<mycustomsection>
<add key="key1" value="value1"/>
<add key="key2" value="value2"/>
</mycustomsection>

mycustomsection程序段包含一个命名值集合,其两个入口由key1和key2定义。

singletagsectionhandler较容易构造。正如namevaluesectionhandler,配置节可在configsections节点中找到。但在singletagsectionhandlers和namevaluesectionhandlers中,配置数据的添加方式是不同的,如下所示:

. . .
<section name="mysingletagsection"
type="system.configuration.singletagsectionhandler"/>
. . .
<mysingletagsection setting1="value1" setting2="value2" setting3="value3"/>
. . .

dictionarysectionhandler与namevaluesectionhandler相似,但前者返回hashtable,后者返回namevaluecollection。当访问大量配置值时,hashtable要快于namevaluecollectio。dictionarysectionhandler与namevaluesectionhandler的构造方式相同,如下例:

. . .
<section name="mydictionarysection"
type="system.configuration.dictionarysectionhandler"/>
. . .
<mydictionarysection>
<add key="key1" value="value1"/>
</mydictionarysection>
. . .

我自己用了一下,报错。。原因还挺特别

system.configuration.dictionarysectionhandler,system,version=1.0.3300.0,culture=neutral, publickeytoken=b77a5c561934e089

没有办法把type改为以上那段。终于行了。

构造节组的方法与构造单独配置节的方法基本相同,唯一的不同在于前者的自定义节点互相嵌套。借用前面的节组定义,以下是对节组的实现:

<customgroup>
<custom1>
<add key="key1" value="value1"/>
</custom1>
<custom2>
<add key="key1" value="value1"/>
</custom2>
</customgroup>

通过system.configuration.configurationsettings命名空间的getconfig()方法和自定义配置节的串值来访问应用配置设置,然后将该方法的结果转为合适的类型。

对于singletagsectionhandler,将结果转为system.collections命名空间的idictionary接口类型。对于namevaluesectionhandler,结果转为在system.collections.specialized命名空间中定义的namevaluecollection类型。最后,对于dictionarysectionhandler,结果转为system.collections命名空间中的hashtable类型。

对于节组,唯一的区别是,将加上正斜杠和配置节名的节组名作为字符串参数传递给getconfig()方法,以访问自定义设置。

以下是一个使用这些自定义设置的实例:

    system.collections.idictionary stsh = (system.collections.idictionary)
system.configuration.configurationsettings.getconfig("mysingletagsection");
    system.collections.specialized.namevaluecollection nvsh =
 (system.collections.specialized.namevaluecollection)
 system.configuration.configurationsettings.getconfig("mynamevaluesection");
    system.collections.hashtable dsh = (system.collections.hashtable)
 system.configuration.configurationsettings.getconfig("mydictionarysection");
    system.collections.specialized.namevaluecollection sgnvsh =
 (system.collections.specialized.namevaluecollection)
 system.configuration.configurationsettings.getconfig("mysectiongroup/mysection
1");
    system.diagnostics.debug.writeline((string)stsh["sample1"]);
    system.diagnostics.debug.writeline((string)nvsh["key1"]);
    system.diagnostics.debug.writeline((string)dsh["key1"]);
    system.diagnostics.debug.writeline((string)sgnvsh["key1"]);

以下是用于上面代码的一段配置xml代码:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <configsections>
        <section name="mysingletagsection"
 type="system.configuration.singletagsectionhandler"/>
        <section name="mydictionarysection"
 type="system.configuration.dictionarysectionhandler"/>
        <section name="mynamevaluesection"
type="system.configuration.namevaluesectionhandler"/>
        <sectiongroup name="mysectiongroup">
            <section name="mysection1"
 type="system.configuration.namevaluesectionhandler"/>
            <section name="mysection2"
 type="system.configuration.namevaluesectionhandler"/>
        </sectiongroup>
    </configsections>
    <mysingletagsection sample1="value1" sample2="value2" sample3="value3"/>
    <mydictionarysection>
        <add key="key1" value="value1"/>
        <add key="key2" value="value2"/>
    </mydictionarysection>
    <mynamevaluesection>   
        <add key="key1" value="value1"/>
        <add key="key2" value="value2"/>
    </mynamevaluesection>
    <mysectiongroup>
        <mysection1>
            <add key="key1" value="value1"/>
            <add key="key2" value="value2"/>
        </mysection1>
        <mysection2>
            <add key="key1" value="value1"/>
            <add key="key2" value="value2"/>
        </mysection2>
    </mysectiongroup>
</configuration>

欲知更多信息,请访问msdn library中的application configuration settingsconfiguration schema



发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表