VS2008、Asp.Net 3.5
前几天写了一篇
使用IConfigurationSectionHandler在web.config中增加自定义配置,然后看到有回复说IConfigurationSectionHandler在2.0时代被弃用了,推荐使用
ConfigurationSection,不敢怠慢,赶紧看看ConfigurationSecion是如何使用的。
1. 实现目的
我希望在web.config中,配置网站信息,管理员信息,和用户信息(当然这个配置有点不切实际了,这里只是为了演示),所以,我希望按下面的格式做配置。
<siteSetting siteName="遇见未来" siteVersion="1.0" closed="false">
<siteAdmin adminId="1" adminName="guozhijian"/>
<siteUsers>
<siteUser userId="1" userName="zhanglanzhen"/>
<siteUser userId="2" userName="wdy"/>
</siteUsers>
</siteSetting>
这个siteSetting配置节点是一个稍微复杂一点的配置,自己包含有Attributes,同时包含子节点siteAdmin, siteUsers, 而siteUsers又包含多个siteUser子节点。
接下来我要定义几个类,分别代表各个不同的节点。有一定的规则:
代表根节点,也就是siteSetting节点的类,继承自ConfigurationSection类
代表单一子节点的siteAdmin, siteUser类,继承自ConfigurationElement类
包含多个同名子节点的siteUsers类,继承自ConfigurationElementCollection类
2. SiteAdmin类
public class SiteAdmin : ConfigurationElement

{
[ConfigurationProperty("adminId", IsRequired=true)]

public int AdminId
{

get
{ return Convert.ToInt32(this["adminId"]); }

set
{ this["adminId"] = value; }
}
[ConfigurationProperty("adminName")]

public string AdminName
{

get
{ return this["adminName"] as string; }

set
{ this["adminName"] = value; }
}
}
注意ConfigurationPropertyAttribute,和this关键字,很明显在基类中定义了索引器。本文并不想对这些做过多探讨,直接以代码展示。
3. SiteUser类

public class SiteUser : ConfigurationElement
{

[ConfigurationProperty("userId",IsRequired=true)]

public int UserId
{

get
{ return Convert.ToInt32(this["userId"]); }

set
{ this["userId"] = value; }
}
[ConfigurationProperty("userName")]

public string UserName
{

get
{ return this["userName"] as string; }

set
{ this["userName"] = value; }
}
}
4. SiteUsers类

public class SiteUsers : ConfigurationElementCollection
{


protected override ConfigurationElement CreateNewElement()
{
return new SiteUser();
}


protected override object GetElementKey(ConfigurationElement element)
{
SiteUser siteUser = element as SiteUser;
return siteUser.UserId;
}


public override ConfigurationElementCollectionType CollectionType
{

get
{
return ConfigurationElementCollectionType.BasicMap;
}
}

protected override string ElementName
{

get
{
return "siteUser";
}
}
}
继承自ConfigurationElementCollection的类,必须override以上4个方法。
SiteUsers是SiteUser的集合,因此不难理解上述4个override方法的目的。
5. SiteSetting类

public class SiteSetting : ConfigurationSection
{
[ConfigurationProperty("siteName")]

public string SiteName
{

get
{ return this["siteName"] as string; }

set
{ this["siteName"] = value; }
}
[ConfigurationProperty("siteVersion")]

public string SiteVersion
{

get
{ return this["siteVersion"] as string; }

set
{ this["siteVersion"] = value; }
}
[ConfigurationProperty("closed", IsRequired=true)]

public bool Closed
{

get
{ return (bool)this["closed"]; }

set
{ this["closed"] = value; }
}

[ConfigurationProperty("siteAdmin")]

public SiteAdmin SiteAdmin
{

get
{ return this["siteAdmin"] as SiteAdmin; }

set
{ this["siteAdmin"] = value; }
}
[ConfigurationProperty("siteUsers")]

public SiteUsers SiteUsers
{

get
{ return this["siteUsers"] as SiteUsers; }
}
}
6. 在web.config添加我们的自定义配置
根据我们最初的设想,现在来对web.config进行配置
在<configSections></configSections>中加入:
<section name="siteSetting" type="Tristan.SeeCustomCfg.SiteSetting"/>
在<configuration></configuration>中加入:
<siteSetting siteName="遇见未来" siteVersion="1.0" closed="false">
<siteAdmin adminId="1" adminName="guozhijian"/>
<siteUsers>
<siteUser userId="1" userName="zhanglanzhen"/>
<siteUser userId="2" userName="wdy"/>
</siteUsers>
</siteSetting>
7. 检验结果
这样就完成了吗?是的。
来写简单的测试代码,将我们的自定义配置信息输出来:

public partial class _Default : System.Web.UI.Page
{

protected void Page_Load(object sender, EventArgs e)
{

SiteSetting siteSetting = ConfigurationManager.GetSection("siteSetting") as SiteSetting;

Response.Write(siteSetting.SiteName + "," + siteSetting.SiteVersion + "," + siteSetting.Closed.ToString());
Response.Write("<br/>");

Response.Write(siteSetting.SiteAdmin.AdminId.ToString() + "," + siteSetting.SiteAdmin.AdminName);
Response.Write("<br/>");


foreach (SiteUser u in siteSetting.SiteUsers)
{
Response.Write(u.UserId.ToString() + "," + u.UserName);
Response.Write("<br/>");
}
}
}
测试通过:)
再联想之前使用IConfigurationSectionHandler,我觉得比本文描写的方法更好用,为什么?因为更容易理解啊,只需实现一个接口,不像这个,要根据不同的情况分别继承那么几个类。
如果IConfigurationSectionHandler果真在2.0里不推荐使用,那么却又在3.5中恢复身份,也是可以理解的。
posted on 2008-01-31 20:31
Tristan(GuoZhijian) 阅读(2107)
评论(6) 编辑 收藏 网摘 所属分类:
Asp.Net