日斋
日新月异

在.NET程序中一般都有个应用程序配置文件在ASP.NET中是web.config,在控制台应用程序和Windows应用程序中是app.config。我们通常使用此配置文件来设置一些程序会用到的信息,因为它比硬编码更容易修改和发布。
正如以前在开发过程中,我们会把连接字符串会写在<connectionStrings>配置节中;会把一些全局级的程序设置写在<appSettings>配置节中。类似的还有compilation、authentication、authorization、System.Web等配置节。但这些配置节不是你随便想写什么就写什么,如果想要建立我们自定义的配置节的话,那需要按照下面的步骤一步一步来实现。

比如下面是我们需要在配置文件中新定义的配置节

 

  1. <CopyInfo firmName="灰灰虫的家" authorizedCode="999999999">   
  2.     <contacts>   
  3.       <add name="telephone" content="0531-12345678"></add>   
  4.       <add name="address" content ="山东省济南市历下区"></add>   
  5.     </contacts>   
  6. </CopyInfo>  

 

上面的配置节名称为CopyInfo,它包含两个属性firmName和authorizeCode,另外还包含一个子元素<contacts>,在<contacts>中可以添加多个子元素配置节。

下面开始实现上面的配置信息。

一、创建CopyInfo配置节点的对应类。
这一步很简单,只需要我们创建一个派生自ConfigurationSection的类(CopyInfo)。由于此配置节中包含两个属性firmName和autorizedCode,因此需要在类中编写两个属性FirmName和AuthorizedCode来映射配置节的属性firmName和autorizedCode(注意:为了区分“类的属性”和“配置节的属性”,我用单词的首字母大小写进行区分)。我们可以使用ConfigurationProperty标签来实现类的属性与配置节属性的映射

图1

图《1》
上面的代码很简单,只包含了firmName和authorizeCode两个属性的定义,并没有包含子元素<contact>的定义。
需要我们注意的有两点:
1.该类(FirmAuthorized)派生自ConfigurationSection类,并定义了两个string型的属性FirmName和AuthorizedCode。这两个属性中使用this["XmlAttributeName"]来读取配置节中指定的属性信息。
2.在FirmName和AuthorizedCode这两个属性上加上了ConfigurationProperty这个Attributes标签。在这个标签中把“类属性”和“配置节属性”进行映射。
ConfigurationProperty类的声明如下:
ConfigurationProperty(string name,Named Parameters)
其第一个参数name是必需的,其余的参数为可选参数。
string name:指示该类属性对应的config文件中配置节的属性名称。即通过此参数实现“类属性”和“配置节属性”的映射。
Named Parameters:包含多个值DefaultValue-默认值属性,如果配置节中没有指定值,则默认使用此值。IsRequired-此属性值在配置文件中是否是必需的。其余的Named Parameter在这里不多说了,一般都能见文识意。

二、在web.config中注册自定义配置节。
在上一步中我们定义了FirmAuthorized类,用来读取配置文件中指定的配置节的信息。那这一步就是让系统把该类与相应的配置节信息相关联。
在web.config文件中添加代码如下:

图2

《图2》
上段的代码给出了两个信息:
1.把FirmAuthorized类与CopyInfo配置节相关联起来,使FirmAuthorized类能够读取到CopyInfo配置节中的内容(CopyInfo配置节的内容详见后面:三、在web.config添加自定义配置节)。
2.我们自定义的配置节的名称是<CopyInfo>
需要大家注意的是:type的值应当是类的完全限定名,即“NamepSpace.ClassName,AssemblyName”的格式。由于我把FirmAuthorized类放在App_Code文件夹中,所以在这里我简化了type的写法。

三、在web.config添加自定义配置节
在上一步中的ConfigSections中注册了自定义配置节,下面我们就可以编写我们自定义配置节的信息了。
web.config中添加代码如下:

图3

《图3》
到目前为止我们完成了自定义配置节功能了。下面我们看看如何在程序中读取自定义配置节中的信息。

四、在程序中读取自定义配置节的信息
我们可以使用ConfigurationSettings类的静态方法GetConfig()来把配置文件中的CopyInfo配置节信息反序列化成FormAuthorized类的对象,然后就可以读取出FormAuthorized对象的信息了。

图4

《图4》
GetConfig()方法在读取配置节信息的时候会自动把配置节的信息缓存在内存中。除非重启Web服务器、修改web.config文件或更新bin目录中的程序集。正在因为它能够在内存中进行缓存,所以建议把下面的代码写在一个静态方法中。

好了,到此为止我们在web.config文件中添加了自定义配置节,并读取出了其中的数据。运行结果如下:

图5

《图5》

通过上面的内容,我们可以添加一个自定义的配置节,并且为配置节定义了两个属性firmName和authorizedCode。 下面我们再进一步看一看如何为自定义配置节添加子元素<contacts>,该子元素可以包含一组配置信息。如下:
<CopyInfo firmName="灰灰虫的家" authorizedCode="999999999">
    <contacts>
      <add name="telephone" content="0531-12345678"></add>
      <add name="address" content ="山东省济南市历下区"></add>
    </contacts>
</CopyInfo>

为了实现这个功能,我们需要再添加两个类:一个类用来对应集合中的每个项(在这里我们把它命名为ContactItem),即对应<add>配置节,这个类需要派生自ConfigurationElement;另一个类用来对应集合(在这里我们把它命名为ContactItemCollection),即<contacts>配置节,这个类需要派生自ConfigurationElementCollection

五、集合项类(ContactItem类)的定义
该类需要派生自ConfigurationElement类。

图6

《图6》
在这里我们仍需要在类中定义<add>配置节中两个属性name和content的映射属性Name和Content,并为它们加上ConfigurationProperty()标签。并使用this["XmlAttributeName"]返回该配置节中的属性的值。

六、集合类(ContactItemCollection)的定义
该类需要派生自ConfigurationElementCollection类。
ConfigurationElementCollection类有两个抽象方法需要实现:CreateNewElement()GetElementKey(ConfigurationElement element)
CreateNewElement()方法需要返回集合中单个对象的实例。而GetElementKey(ConfigurationElement element)方法则是用来返回单个对象的的key的名子。

图7

《图7》

七、向第一步中自定义配置节类(FirmAuthorized)中添加对第六步中集合类(ContactItemCollection)的引用。
修改后的FirmAuthorized类如下:

图8

《图8》

八、在web.config文件的自定义配置节中添加<contacts>配置节的信息

图9

《图9》

 

九、再次编写代码读取自定义配置节的信息

图10

《图10》

运行后的结果:

 

图11

posted on 2010-06-23 14:22  李承隆  阅读(363)  评论(0编辑  收藏  举报