2.在ASP.NET2.0中我们已经能够很简单的操作配置文件中的节点了,他为我们提供了一系列的类如我们定义一个类只要继承ConfigurationSection就可以定义我们的节点了,子节点可以继承ConfigurationElement等等。只要在属性上标注ConfigurationProperty attribute即可。
定义配置类:
复制C#代码保存代码public class CustomConfiguration : ConfigurationSection
{
[ConfigurationProperty("webName",
DefaultValue = "Custom configuration section in web.config ",
IsRequired = false)]
public string WebName
{
get { return this["webName"] as string; }
}
}
以上只列出了读取属性的方法,每一个用ConfigurationProperty attribute标注的属性就能够自动从web.config文件中反序列过来实例化当前类。下面我们来看看ConfigurationProperty attribute的每一个属性的作用。
Name:配置节点名称或属性名称,要求唯一标识。
DefaultValue:配置文件中每个属性的默认值,如果配置文件中没有定义此属性则在代码中调用此属性时,将取得这个值。
IsRequired:标明当前属性是否必须,如果为true而配置文件中并没有定义此属性,当访问此网站时将抛出错误。
我们可以通过System.Web.Configuration.WebConfigurationManager来获取此节点的实例,代码如下:
复制C#代码保存代码public static CumstomConfiguration GetConfig()
{
return WebConfigurationManager.GetSection("NExplus") as CumstomConfiguration;
}
基于集合配置属性的读取:
很多时候我们需要得到一个集合的所有配置,最常见的莫过于providers,系统已经为我们准备好了ProviderCollection,我们只要直接引用就好了。但是如果遇到向上面定义的节点的读取就需要我们自己来写一个集合,这个集合要继承ConfigurationElementCollection类,而当前实体类需继承ConfigurationElement类。为了读取节点我们定义一个实体类如下:
复制C#代码保存代码public class ConfigurationState : ConfigurationElement
{
[ConfigurationProperty("name", IsRequired = true)]
public string Name
{
get { return this["name"] as string; }
}
[ConfigurationProperty("code", IsRequired = false)]
public string Code
{
get { return this["code"] as string; }
}
}
有了实体类我们当然要写一个集合类,代码如下:
复制C#代码保存代码public class ConfigurationStateCollection : ConfigurationElementCollection
{
public ConfigurationState this[int index]
{
get { return base.BaseGet(index) as ConfigurationState; }
set
{
if (base.BaseGet(index) != null)
{
base.BaseRemoveAt(index);
}
this.BaseAdd(index, value);
}
}
protected override ConfigurationElement CreateNewElement()
{
return new ConfigurationState();
}
protected override object GetElementKey(ConfigurationElement element)
{
return ((ConfigurationState) element).Name;
}
}
我们需要对当前集合进行索引读取或设置,重写了两个方法,从而能够获取当前实例和获取当前配置节点的名称等,当然最后一步就是要将它加入到配置类中(次配置类一定要在configSettings节点中标注)。代码如下:
复制C#代码保存代码public class CustomConfiguration : ConfigurationSection
{
[ConfigurationProperty("states")]
public ConfigurationStateCollection CustomStates
{
get { return this["states"] as ConfigurationStateCollection; }
}
}
总结:
这篇文章已经不是什么新鲜的事了,由于最近我也在做这个事情,其中值得说明的是在providers的应用,我们可以通过ProvidersCollection来读取其集合,通过ProvidersHelper来实例化当前provider,如果在你的数据库提供者抽象类中继承ProviderBase类万事就OK了。如果考虑到性能问题可以借助Cache来提高一些性能,最后还是希望能给更多人带来一点帮助,分享一下我的经验。
来源:CNBLOGS