【转载】通过ConfigurationSection来轻松地加载配置文件
2010-05-06 11:37 Virus-BeautyCode 阅读(1169) 评论(0) 编辑 收藏 举报原文地址:通过ConfigurationSection来轻松地加载配置文件
最近写了一段自定义的ConfigurationSection继承类,通过该class可以轻松得定义和读取配置文件信息,
注意这里使用的是c# 2.0来实现的,相比1.1必须通过实现IConfigurationSectionHandler接口来自定义配置节点类方便多了
不论是web.config还是app.config,都可以使用ConfigurationManager类加载配置文件中自定义的节点内容。
以下是配置文件的层次结构:
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的自定义配置节点类:
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 }
原文地址:使用 ConfigurationSection 创建自定义配置节
我们可以通过用自己的 XML 配置元素来扩展标准的 ASP.NET 配置设置集,要完成这一功能,我们必须实现继承System.Configuration.ConfigurationSection 类来实现自定义配置节,在1.0中当然也可以通过IconfigurationSectionHandler 接口创建自定义配置节!这里我们主要学一下通过ConfigurationSection类来实现简单的配置处理程序.
先看一下在web.config文件中的配置情况,在这里有两个元素,第一个mysection,有两个属性user,password,第二个也有两个属性element1,和element2。配置比较简单。
<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>
理解配置文件结构后,我们就需要用继承自System.Configuration.ConfigurationSection的基类来实现简单的配置类ConfigSection,在2.0中,我们只需要这一个类就能实现完成配置,下面请看代码:
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"]; }
}
}
通过下面的代码就可以获得在配置文件中设置的值了
Response.Write("用户名:"+config.User.ToString() + "密码:" + config.PassWord.ToString() + "元素属性:" + config.Element.Element1.ToString() + config.Element.Element2.ToString());