.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 settings和configuration schema。
新闻热点
疑难解答
图片精选