ConfigurationSection使用
最近写了一段自定义的ConfigurationSection继承类,通过该class可以轻松得定义和读取配置文件信息,
注意这里使用的是c# 2.0来实现的,相比1.1必须通过实现IConfigurationSectionHandler接口来自定义配置节点类方便多了
不论是web.config还是app.config,都可以使用ConfigurationManager类加载配置文件中自定义的节点内容。
以下是配置文件的层次结构:
注意order和lineItem节点都是允许重复出现的
以下是继承自ConfigurationSection的自定义配置节点类:
注意这里使用的是c# 2.0来实现的,相比1.1必须通过实现IConfigurationSectionHandler接口来自定义配置节点类方便多了
不论是web.config还是app.config,都可以使用ConfigurationManager类加载配置文件中自定义的节点内容。
以下是配置文件的层次结构:
1<?xml version="1.0" encoding="utf-8" ?>
2<configuration>
3 <configSections>
4 <section name="orders" type="ConsoleTest.OrdersSection, ConsoleTest"/>
5 </configSections>
6 <orders companyID="2001">
7 <order number="100001" amount="222.22">
8 <lineItems warehouseNumber="02">
9 <lineItem number="00-000-001" description="wii"/>
10 </lineItems>
11 </order>
12 <order number="300001" amount="33.33">
13 <lineItems warehouseNumber="99">
14 <lineItem number="00-000-001" description="xbox 360"/>
15 <lineItem number="00-000-003" description="playstation 3"/>
16 </lineItems>
17 </order>
18 </orders>
19</configuration>
2<configuration>
3 <configSections>
4 <section name="orders" type="ConsoleTest.OrdersSection, ConsoleTest"/>
5 </configSections>
6 <orders companyID="2001">
7 <order number="100001" amount="222.22">
8 <lineItems warehouseNumber="02">
9 <lineItem number="00-000-001" description="wii"/>
10 </lineItems>
11 </order>
12 <order number="300001" amount="33.33">
13 <lineItems warehouseNumber="99">
14 <lineItem number="00-000-001" description="xbox 360"/>
15 <lineItem number="00-000-003" description="playstation 3"/>
16 </lineItems>
17 </order>
18 </orders>
19</configuration>
注意order和lineItem节点都是允许重复出现的
以下是继承自ConfigurationSection的自定义配置节点类:
1public class OrdersSection : ConfigurationSection
2 {
3 [ConfigurationProperty("companyID", IsRequired = true)]
4 public string CompanyID
5 {
6 get
7 {
8 return (string)base["companyID"];
9 }
10 set
11 {
12 base["companyID"] = value;
13 }
14 }
15
16 [ConfigurationProperty("", IsDefaultCollection = true)]
17 public OrderElementCollection Orders
18 {
19 get
20 {
21 return (OrderElementCollection)base[""];
22 }
23 }
24 }
25
26 public class OrderElementCollection : ConfigurationElementCollection
27 {
28 protected override ConfigurationElement CreateNewElement()
29 {
30 return new OrderElement();
31 }
32 protected override object GetElementKey(ConfigurationElement element)
33 {
34 return ((OrderElement)element).Number;
35 }
36
37 public override ConfigurationElementCollectionType CollectionType
38 {
39 get
40 {
41 return ConfigurationElementCollectionType.BasicMap;
42 }
43 }
44 protected override string ElementName
45 {
46 get
47 {
48 return "order";
49 }
50 }
51
52 public OrderElement this[int index]
53 {
54 get
55 {
56 return (OrderElement)BaseGet(index);
57 }
58 set
59 {
60 if (BaseGet(index) != null)
61 {
62 BaseRemoveAt(index);
63 }
64 BaseAdd(index, value);
65 }
66 }
67 }
68
69 public class OrderElement : ConfigurationElement
70 {
71 [ConfigurationProperty("number", IsRequired = true)]
72 public string Number
73 {
74 get
75 {
76 return (string)base["number"];
77 }
78 set
79 {
80 base["number"] = value;
81 }
82 }
83
84 [ConfigurationProperty("amount", IsRequired = true)]
85 public double Amount
86 {
87 get
88 {
89 return (double)base["amount"];
90 }
91 set
92 {
93 base["amount"] = value;
94 }
95 }
96
97 [ConfigurationProperty("lineItems", IsDefaultCollection = true)]
98 public LineItemElementCollection LineItems
99 {
100 get
101 {
102 return (LineItemElementCollection)base["lineItems"];
103 }
104 }
105 }
106
107 public class LineItemElementCollection : ConfigurationElementCollection
108 {
109 [ConfigurationProperty("warehouseNumber", IsRequired = true)]
110 public string WarehouseNumber
111 {
112 get
113 {
114 return (string)base["warehouseNumber"];
115 }
116 set
117 {
118 base["warehouseNumber"] = value;
119 }
120 }
121
122 protected override ConfigurationElement CreateNewElement()
123 {
124 return new LineItemElement();
125 }
126 protected override object GetElementKey(ConfigurationElement element)
127 {
128 return ( (LineItemElement)element ).Number;
129 }
130
131 public override ConfigurationElementCollectionType CollectionType
132 {
133 get
134 {
135 return ConfigurationElementCollectionType.BasicMap;
136 }
137 }
138 protected override string ElementName
139 {
140 get
141 {
142 return "lineItem";
143 }
144 }
145
146 public LineItemElement this[int index]
147 {
148 get
149 {
150 return (LineItemElement)BaseGet(index);
151 }
152 set
153 {
154 if (BaseGet(index) != null)
155 {
156 BaseRemoveAt(index);
157 }
158 BaseAdd(index, value);
159 }
160 }
161 }
162
163 public class LineItemElement : ConfigurationElement
164 {
165 [ConfigurationProperty("number", IsKey=true, IsRequired = true)]
166 public string Number
167 {
168 get
169 {
170 return (string)base["number"];
171 }
172 set
173 {
174 base["number"] = value;
175 }
176 }
177
178 [ConfigurationProperty("description", IsRequired = true)]
179 public string Description
180 {
181 get
182 {
183 return (string)base["description"];
184 }
185 set
186 {
187 base["description"] = value;
188 }
189 }
190 }
2 {
3 [ConfigurationProperty("companyID", IsRequired = true)]
4 public string CompanyID
5 {
6 get
7 {
8 return (string)base["companyID"];
9 }
10 set
11 {
12 base["companyID"] = value;
13 }
14 }
15
16 [ConfigurationProperty("", IsDefaultCollection = true)]
17 public OrderElementCollection Orders
18 {
19 get
20 {
21 return (OrderElementCollection)base[""];
22 }
23 }
24 }
25
26 public class OrderElementCollection : ConfigurationElementCollection
27 {
28 protected override ConfigurationElement CreateNewElement()
29 {
30 return new OrderElement();
31 }
32 protected override object GetElementKey(ConfigurationElement element)
33 {
34 return ((OrderElement)element).Number;
35 }
36
37 public override ConfigurationElementCollectionType CollectionType
38 {
39 get
40 {
41 return ConfigurationElementCollectionType.BasicMap;
42 }
43 }
44 protected override string ElementName
45 {
46 get
47 {
48 return "order";
49 }
50 }
51
52 public OrderElement this[int index]
53 {
54 get
55 {
56 return (OrderElement)BaseGet(index);
57 }
58 set
59 {
60 if (BaseGet(index) != null)
61 {
62 BaseRemoveAt(index);
63 }
64 BaseAdd(index, value);
65 }
66 }
67 }
68
69 public class OrderElement : ConfigurationElement
70 {
71 [ConfigurationProperty("number", IsRequired = true)]
72 public string Number
73 {
74 get
75 {
76 return (string)base["number"];
77 }
78 set
79 {
80 base["number"] = value;
81 }
82 }
83
84 [ConfigurationProperty("amount", IsRequired = true)]
85 public double Amount
86 {
87 get
88 {
89 return (double)base["amount"];
90 }
91 set
92 {
93 base["amount"] = value;
94 }
95 }
96
97 [ConfigurationProperty("lineItems", IsDefaultCollection = true)]
98 public LineItemElementCollection LineItems
99 {
100 get
101 {
102 return (LineItemElementCollection)base["lineItems"];
103 }
104 }
105 }
106
107 public class LineItemElementCollection : ConfigurationElementCollection
108 {
109 [ConfigurationProperty("warehouseNumber", IsRequired = true)]
110 public string WarehouseNumber
111 {
112 get
113 {
114 return (string)base["warehouseNumber"];
115 }
116 set
117 {
118 base["warehouseNumber"] = value;
119 }
120 }
121
122 protected override ConfigurationElement CreateNewElement()
123 {
124 return new LineItemElement();
125 }
126 protected override object GetElementKey(ConfigurationElement element)
127 {
128 return ( (LineItemElement)element ).Number;
129 }
130
131 public override ConfigurationElementCollectionType CollectionType
132 {
133 get
134 {
135 return ConfigurationElementCollectionType.BasicMap;
136 }
137 }
138 protected override string ElementName
139 {
140 get
141 {
142 return "lineItem";
143 }
144 }
145
146 public LineItemElement this[int index]
147 {
148 get
149 {
150 return (LineItemElement)BaseGet(index);
151 }
152 set
153 {
154 if (BaseGet(index) != null)
155 {
156 BaseRemoveAt(index);
157 }
158 BaseAdd(index, value);
159 }
160 }
161 }
162
163 public class LineItemElement : ConfigurationElement
164 {
165 [ConfigurationProperty("number", IsKey=true, IsRequired = true)]
166 public string Number
167 {
168 get
169 {
170 return (string)base["number"];
171 }
172 set
173 {
174 base["number"] = value;
175 }
176 }
177
178 [ConfigurationProperty("description", IsRequired = true)]
179 public string Description
180 {
181 get
182 {
183 return (string)base["description"];
184 }
185 set
186 {
187 base["description"] = value;
188 }
189 }
190 }
这样我们就完成了webconfig节点的自定义和对象的实体化, 我们在使用的使用值需要简单的代码就能获取到相应对象的实体信息;如:
OrdersSection config = (OrdersSection)ConfigurationManager.GetSection("orders");
另一中用法:sectionGroup 配置 。如要配置出如下webconfig信息
那么我们看下实体是如何定义的 。
上面的实体对象包含一个节点对象信息,我们看下这个对象是如何定义的 。
代码的调用就相当简单了 :
<configSections>
<sectionGroup name="mygroup">
<section name="mysection"
type="ConfigSection"
allowDefinition="Everywhere"
allowLocation="true"/>
</sectionGroup>
</configSections>
<mygroup>
<mysection user="用户" password="密码">
<element element1="属性1" element2="属性2"></element>
</mysection>
</mygroup>
<sectionGroup name="mygroup">
<section name="mysection"
type="ConfigSection"
allowDefinition="Everywhere"
allowLocation="true"/>
</sectionGroup>
</configSections>
<mygroup>
<mysection user="用户" password="密码">
<element element1="属性1" element2="属性2"></element>
</mysection>
</mygroup>
那么我们看下实体是如何定义的 。
using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
/// <summary>
/// ConfigSection 的摘要说明
/// </summary>
public class ConfigSection:ConfigurationSection
{
public ConfigSection()
{
//
// TODO: 在此处添加构造函数逻辑
//
}
[ConfigurationProperty("user",DefaultValue="yanghong",IsRequired=true)]
public string User
{
get { return (string)this["user"]; }
set { this["user"] = value; }
}
[ConfigurationProperty("password",DefaultValue="password",IsRequired=true)]
public string PassWord
{
get { return (string)this["password"]; }
set { this["password"] = value; }
}
[ConfigurationProperty("element")]
public elementinfo Element
{
get { return (elementinfo)this["element"]; }
set {this["element"] = value; }
}
}
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
/// <summary>
/// ConfigSection 的摘要说明
/// </summary>
public class ConfigSection:ConfigurationSection
{
public ConfigSection()
{
//
// TODO: 在此处添加构造函数逻辑
//
}
[ConfigurationProperty("user",DefaultValue="yanghong",IsRequired=true)]
public string User
{
get { return (string)this["user"]; }
set { this["user"] = value; }
}
[ConfigurationProperty("password",DefaultValue="password",IsRequired=true)]
public string PassWord
{
get { return (string)this["password"]; }
set { this["password"] = value; }
}
[ConfigurationProperty("element")]
public elementinfo Element
{
get { return (elementinfo)this["element"]; }
set {this["element"] = value; }
}
}
上面的实体对象包含一个节点对象信息,我们看下这个对象是如何定义的 。
public class elementinfo : ConfigurationElement
{
public elementinfo() { }
[ConfigurationProperty("element1", DefaultValue = "element1", IsRequired = true)]
public string Element1
{
get { return (string)this["element1"]; }
}
[ConfigurationProperty("element2",DefaultValue="element2",IsRequired=true)]
public string Element2
{
get { return (string)this["element2"]; }
}
}
{
public elementinfo() { }
[ConfigurationProperty("element1", DefaultValue = "element1", IsRequired = true)]
public string Element1
{
get { return (string)this["element1"]; }
}
[ConfigurationProperty("element2",DefaultValue="element2",IsRequired=true)]
public string Element2
{
get { return (string)this["element2"]; }
}
}
代码的调用就相当简单了 :
ConfigSection config = (ConfigSection)ConfigurationManager.GetSection("mygroup/mysection");
Response.Write("用户名:"+config.User.ToString() + "密码:" + config.PassWord.ToString() + "元素属性:" + config.Element.Element1.ToString() + config.Element.Element2.ToString());
Response.Write("用户名:"+config.User.ToString() + "密码:" + config.PassWord.ToString() + "元素属性:" + config.Element.Element1.ToString() + config.Element.Element2.ToString());