Live with passion, coding with passion....
在 .net 1.0/1.1 中,.net framework给我们提供了基于 xml 文件的配置系统,使我们能够非常方便的读取和扩展配置数据。在 .net 2.0 中,这种基于 xml 文件的配置系统被进一步改善了,更容易被读取和扩展,而且增加了在运行时更改配置和加密配置数据的支持。
在 .net 配置系统中一般包括两种类型的元素:
在配置文件中使用自定义的配置节/配置节组时,需要首先在configSections元素中申明。如下的一个例子(注意 configuration 元素的 xmlns 属性。下面的配置代码仅仅是为了举例,使用了 machine.config 中定义的配置节、配置节组。):
<configuration xmlns="http://schemas.microsoft.com/.NetConfiguration/v2.0"> <!-- Define custom configuration sections/section groups. --> <configSections> <section name="appSettings" type="type here" restartOnExternalChanges="false" /> <sectionGroup name="system.web" type="type here"> <section name="pages" type="type here" /> </sectionGroup> </configSections> <!-- Configuration data --> <appSettings> <add key="--" value="---" /> </appSettings> <system.web> <pages> <controls> <add tagPrefix="chenglin" namespace="MyNamespace.WebControls" assembly="MyAssembly"/> </controls> </pages> </system.web> </configuration>
.net framework 配置系统在加载配置数据的时候,会搜索一个由 xml 配置文件构成的树型结构来获取配置数据。在 exe 程序中,一般会搜索两个配置文件:
而在一个 web 应用程序中,可能会包括多个配置文件:
在 .net 2.0 中,配置数据可以从 System.Configuration.Configuration 类中获取。要获取配置节和配置节组的数据可以访问 Configuration 类的 GetSection(string sectionName), GetSectionGroup(string sectionGroupName) 等方法。比如上述的例子中,我们可以调用 Configuration.GetSection 方法,参数 sectionName 分别为
要获取 Configuration 类的实例,可以使用 ConfiguartionManager 或者 WebConfigurationManager 类的相应方法。当然也可以使用 ConfigurationSettings 类的 GetConfig 方法,但是它已经被标记为 Obsolete 。 使用 ConfigurationManager 类或者 WebConfigurationManager 类的另外一个好处是我们指定访问某个配置文件,而不仅仅是默认的配置文件。比如在一个 web 应用程序中,当访问应用程序根目录下的页面的时候,在.net framework 1.0/1.1中我们就不是很容易获取子目录下配置文件的配置内容,但在 2.0 中我们可以指定路径来直接访问。
一般来说,我觉得为一个应用程序写的配置部分的代码按如下的步骤比较好:首先,我们要知道应用程序到底需要什么配置;然后用 xml 的形式写出来;最后再根据 xml 代码写出所需的配置代码。当然将后面两步的顺序交换也是不错的选择。
在 .net framework 1.0/1.1 中,配置节的处理程序需要实现 IConfigurationSectionHandler 接口,然后在程序中处理 xml 数据。而在 .net framework 2.0 中则不一定需要实现 IConfigurationSectionHandler 接口,只需从相应的类继承就可以,而且可以省掉繁琐的 xml 处理过程。.net 2.0中的几个主要的类包括:
<appSettings> <add key="--" value="---" /> </appSettings> <system.web> <pages> <controls> <add tagPrefix="chenglin" namespace="MyNamespace.WebControls" assembly="MyAssembly"/> </controls> </pages> </system.web>
Configuration Section Configuration Element Configuration Section Group Configuration Section Configuration Element Collection Configuration Element
在 PagesSection 类中最重要的代码在static构造函数中。在此构造函数中,我们需要创建 System.Configuration.ConfigurationProperty 类的实例,在这些实例中定义了配置文件中配置数据的属性。这些 ConfigurationProperty 类的实例被添加到一个 System.Configuration.ConfigurationPropertyCollection 对象中。
.net framework 可以通过一个 protected 的 Properties 属性来获取这些已定义的配置数据的信息,用来将对象序列化成相应的 xml 内容,或者将 xml 配置文件中的配置数据转化成相应的对象。这里比较有意思的是,如果在 ConfigurationProperty 中设置的是 ConfigurationPropertyCollection 的类型,则.net framework会自动将其映射到相应的子元素中。比如在前面的例子配置文件中的 pages/controls 元素。
上面的代码和 PagesSection 有很多地方都是相同的。不过需要注意的是,因为这是一个collection,所以允许我们设置集合的属性。有两个地方需要设置:
另外在 TagPrefixInfoCollection 类中很重要的方式有 CreateNewElement 和 GetElementKey,它们被 .net framework 用来创建配置元素的对象,以及被用来确定配置元素在集合中的键值。
最后看看 TagPrefixInfo 类。
TagPrefixInfo 类中重载了 ElementProperty 属性,指定如何验证配置数据。因此,对于一个 ConfigurationElement 来说,除了可以使用 ConfigurationProperty 指定元素属性的信息,也可以使用 ConfigurationElementProperty 指定元素的信息,做到配置元素局部和整体的验证。
在创建好上面所以的代码之后,要读取或者创建配置文件都很容易,这里就不介绍了。 :)
昵称: [登录] [注册]
主页:
邮箱:(仅博主可见)
验证码: 看不清,换一个
评论内容:
登录 注册
[使用Ctrl+Enter键快速提交评论]
Powered by: 博客园 Copyright © Lin