探秘web.config之System.Configuration四大类

 

声明:本文的所有代码引用自五香瓜子的系列文章ASP.NET杂谈-一切都从web.config说起。本文只为学习研究,并无抄袭剽窃之意。

 系列文章对ConfigurationSectionConfigurationElementConfigurationSectionGroupConfigurationElementCollection这四个类进行了分析。本文将从web.config自定义配置节点的结构出发(即从要求出发,而不是先给出处理代码),谈谈什么时候该用哪个类。

 

0.前言

我们已经知道,自定义配置节点时,要在web.config中写入两个部分的内容,一个部分写在configSections之内,即作为<configSections>的子节点,另一个部分作为根节点<configuration>的子节点(不要将这一部分写在<system.web>之类的节点之内哦,否则asp.net配置系统会找不到自定义的节点的)。第一个部分就是处理程序节点,第二个部分才是真正的自定义配置节点,也就是说,第一个部分是用来声明怎么样处理第二个部分的。

 

1. ConfigurationSection类的用法

1:  <configSections>
2:
<section name="MySectionHandle01" type="KevinDiao.MySectionDemo01.MySection,KevinDiao.MySectionDemo01"/>
3:
</configSections>
4:
<MySectionHandle01 username="kevindiao" password="123456"></MySectionHandle01>

上述web.config文件添加了自定义信息项MySectionHandle01,而处理它的程序KevinDiao.MySectionDemo01.MySection类。

那么如何MySection类要怎样定义呢?

就从新添加的这两部分信息推导吧。第一部分仅有一个section,对应于一个自定义的类,不妨取名为MySection该类派生自ConfigurationSection类。

再看第二部分,MySectionHandle01有两个属性usernamepassword,从而MySection类应该有两个属性,不妨取名为UserNamePassword

从分析中可以看出,类的定义要从第一部分和第二部分进行推导,缺少一个部分都无法知道如何推导。

MySection类的定义如下:

View Code
   1:  using System;
2: using System.Collections.Generic;
3: using System.Linq;
4: using System.Text;
5:
6: using System.Configuration;
7:
8: namespace KevinDiao.MySectionDemo01
9: {
10: /// <summary>
11: /// 自定义Section的结构
12: /// </summary>
13: public class MySection:ConfigurationSection
14: {
15: /// <summary>
16: /// 用户名称
17: /// </summary>
18: [ConfigurationProperty("username",IsRequired=true)]
19: public string UserName
20: {
21: get
22: {
23: return (string)this["username"];
24: }
25: set
26: {
27: this["username"] = value;
28: }
29: }
30: /// <summary>
31: /// 用户密码
32: /// </summary>
33: [ConfigurationProperty("password", IsRequired = true)]
34: public string Password
35: {
36: get
37: {
38: return (string)this["password"];
39: }
40: set
41: {
42: this["password"] = value;
43: }
44: }
45: }
46: }

 

 

2.ConfigurationElement的用法

   1:  <configSections>
2:
<section name ="MySectionHandle02" type="KevinDiao.MySectionDemo02.MySectionHandle,KevinDiao.MySectionDemo02"/>
3:
</configSections>
4:
5:
<MySectionHandle02>
6:
<users username="kevin" password="123"></users>
7:
</MySectionHandle02>

第一个部分只有一个section,所以自定义类MySectionHandle(由type属性)应该继承ConfigurationSectionsectionname属性指向第二部分的<MySectionHandle02>节点,说明MySectionHandle类对应<MySectionHandle02>节点。而<MySectionHandle02>节点有子节点<users>,从而MySectionHandle类对应地有一个属性,该属性的类型不应该是string等基本类型(太简单),也不应该是CongfigurationSection(太复杂),而应该是ConfigurationElement类的派生类,不妨取名为MySectionElement类。综上所述,我们需要定义的类有两个。

MySectionHandle类的定义如下:

MySectionHandle
   1:  using System;
2: using System.Collections.Generic;
3: using System.Linq;
4: using System.Text;
5:
6: using System.Configuration;
7:
8: namespace KevinDiao.MySectionDemo02
9: {
10: /// <summary>
11: /// 自定义Section
12: /// </summary>
13: public class MySectionHandle:ConfigurationSection
14: {
15: [ConfigurationProperty("users",IsRequired=true)]
16: public MySectionElement Users
17: {
18: get
19: {
20: return (MySectionElement)this["users"];
21: }
22: }
23: }
24: }

MySectionElement的定义如下:

MySectionElement
   1:  using System;
2: using System.Collections.Generic;
3: using System.Linq;
4: using System.Text;
5:
6: using System.Configuration;
7:
8: namespace KevinDiao.MySectionDemo02
9: {
10: /// <summary>
11: /// 自定义Element
12: /// </summary>
13: public class MySectionElement : ConfigurationElement
14: {
15: /// <summary>
16: /// 用户名
17: /// </summary>
18: [ConfigurationProperty("username", IsRequired = true)]
19: public string UserName
20: {
21: get
22: {
23: return (string)this["username"];
24: }
25: }
26: /// <summary>
27: /// 密码
28: /// </summary>
29: [ConfigurationProperty("password", IsRequired = true)]
30: public string Password
31: {
32: get
33: {
34: return (string)this["password"];
35: }
36: }
37: }
38: }

 

 

3.ConfigurationSectionGroup的用法

View Code
   1:  <configSections>
2:
<sectionGroup name="myBlogs" type="KevinDiao.MySectionDemo01.MySectionGroup,KevinDiao.MySectionDemo01">
3:
<section name="myBlog" type="KevinDiao.MySectionDemo01.MySection,KevinDiao.MySectionDemo01"/>
4:
</sectionGroup>
5:
</configSections>
6:
7:
<myBlogs>
8:
<myBlog name="五香瓜子" url="http://www.cnblogs.com/diaojia/"></myBlog>
9:
</myBlogs>

第一部分出现了<sectionGroup><section>两种节点,说明要用两个类,一个类继承ConfigurationSectionGroup,一个继承ConfigurationSection,不妨将他们命名为MySectionGroupMySection。由于<sectionGroup><section>是父子关系,所以MySectionGroup类应该有一个MySection属性。而从第二部分中<myBlog>nameurl两个属性,推导出MySection类有两个属性。

MySectionGroup的定义如下:

MySectionGroup
   1:   /// <summary>
2: /// 自定义SectionGroup
3: /// </summary>
4: public class MySectionGroup:ConfigurationSectionGroup
5: {
6: [ConfigurationProperty("myBlog")]
7: public MySection MyBlog
8: {
9: get
10: {
11: return (MySection)base.Sections["myBlog"];
12: }
13: }
14: }

MySection的定义如下:

MySection
   1:  /// <summary>
2: /// 自定义Section
3: /// </summary>
4: public class MySection:ConfigurationSection
5: {
6: [ConfigurationProperty("name")]
7: public string BlogName
8: {
9: get
10: {
11: return (string)base["name"];
12: }
13: }
14: [ConfigurationProperty("url")]
15: public string BlogUrl
16: {
17: get
18: {
19: return (string)base["url"];
20: }
21: }
22: }

 

 


4.ConfigurationElementCollection的用法

   1:  <configSections>
2:
<section name="MyBlogs" type="KevinDiao.MySectionDemo03.MyBlogsSection,KevinDiao.MySectionDemo03"/>
3:
</configSections>
4:
<MyBlogs name="KevinDiao">
5:
<add name="五香瓜子" url="http://www.cnblogs.com/diaojia/"></add>
6:
<add name="业精于勤" url="http://diaojia.blog.51cto.com/"></add>
7:
</MyBlogs>

第一部分有一个section,故有自定义类MyBlogsSection继承ConfigurationSectionsectionname属性指向第二部分的MyBlogs节点,MyBlogs节点有两个子节点,因而MyBlogsSection可以有两个属性,两个属性都继承ConfigurationElement类,然而,更有扩展性的设计方式是让MyBlogsSection拥有一个属性,该属性继承ConfigurationElementCollection类,取名为MyBlogsElectionCollection。子节点对应ConfigurationElement类,取名为MyBlogElement。综上所述,需要三个自定义类:MyBlogsSectionMyBlogsElectionCollectionMyBlogElement

MyBlogElement类的定义:

MyBlogElement
   1:      /// <summary>
2: /// 自定义Element
3: /// </summary>
4: public class MyBlogElement:ConfigurationElement
5: {
6: [ConfigurationProperty("name")]
7: public string Name
8: {
9: get
10: {
11: return (string)base["name"];
12: }
13: }
14: [ConfigurationProperty("url")]
15: public string Url
16: {
17: get
18: {
19: return (string)base["url"];
20: }
21: }
22: }

MyBlogElementCollection类的定义:

MyBlogElementCollection
   1:      /// <summary>
2: /// 自定义ElementCollection
3: /// </summary>
4: public class MyBlogElementCollection:ConfigurationElementCollection
5: {
6: protected override ConfigurationElement CreateNewElement()
7: {
8: return new MyBlogElement();
9: }
10: protected override object GetElementKey(ConfigurationElement element)
11: {
12: return ((MyBlogElement)element).Name;
13: }
14: public override ConfigurationElementCollectionType CollectionType
15: {
16: get
17: {
18: return ConfigurationElementCollectionType.BasicMap;
19: }
20: }
21:
22: protected override string ElementName
23: {
24: get
25: {
26: return "myBlog";
27: }
28: }
29: public MyBlogElement this[int index]
30: {
31: get
32: {
33: return (MyBlogElement)BaseGet(index);
34: }
35: set
36: {
37: if (BaseGet(index) != null)
38: {
39: BaseRemoveAt(index);
40: }
41: BaseAdd(index, this);
42: }
43: }
44: }

 MyBlogsSection类的定义:

MyBlogsSection
   1:      /// <summary>
2: /// 自定义Section
3: /// </summary>
4: public class MyBlogSection:ConfigurationSection
5: {
6: [ConfigurationProperty("name")]
7: public string Name
8: {
9: get
10: {
11: return (string)base["name"];
12: }
13: }
14: [ConfigurationProperty("",IsDefaultCollection=true)]
15: public MyBlogElementCollection MyBlogCollection
16: {
17: get
18: {
19: return (MyBlogElementCollection)base[""];
20: }
21: }
22:
23: }

  

  

  

  

 

  



posted @ 2011-08-24 11:58  iliveido  Views(435)  Comments(0)    收藏  举报