Web.config中创建自定义配置节
Web.config文件可谓是每个ASP.NET站点必不可少的一个文件,其中记录了网站的各种配置。一些比较静态但是又可能变更的数据可以放在web.config中,已有的appSettings配置节便有这种用途。
<configuration>
……
<appSettings>
    <add key="setting1" value="valueOfSetting1"/>
  </appSettings>
……
</configuration>
在代码中可以用如下方式访问到添加的setting
string value = ConfigurationManager.AppSettings["setting1"];
这种方式所得到的配置的值缺点至少有二:首先不能用Intelligence来感知我设置的“字段”,其次这种方式只能存放和取出string类型的值(尽管你可以将字符串”true”转换为bool型的true,但是更复杂的类型呢?)。
但是.net框架毕竟是可扩展的,我们也可以在web.config中存放自己的配置节!
如果我在web.config中添加这样一段配置
<configuration>
……
<siteSettings>
    <language>
      <langs value="en,zh"/>
</language>
</siteSettings>
……
</configuration>
怎样通过代码来读取我们设置的值呢?
方法有两种,一种是创建继承自IConfigurationSectionHandler 接口的类,一种是创建继承自ConfigurationSection的类,由于第一种继承自接口的已经是不推荐的了,所以我就只介绍第二种了!
在App_Code下添加如下类
public class LanguageConfigSection:ConfigurationSection
{
     public
LanguageConfigSection()
     {
         //
         //
TODO: Add constructor logic here
         //
     }
    [ConfigurationProperty("langs")]
    public
LanguageConfigElement Languages
    {
        get
{ return (LanguageConfigElement)this["langs"];
}
        set
{ this["langs"]
= value; }
    }
}
public class LanguageConfigElement : ConfigurationElement
{
    [ConfigurationProperty("value")]
    public
string Langs
    {
        get
{ return (string)this["value"];
}
        set
{ this["value"]
= value; }
    }
}
当然如果这样的话web.config会很不友好的说我添加的这个配置节是外来的陌生人,不会收留的。我们需要做的是在configuration配置节下设置自己的配置节的处理方式:
<configuration>
  <configSections>
    <sectionGroup name="siteSettings">
      <section name="language" type="LanguageConfigSection"/>
    </sectionGroup>
  </configSections>
……
</configuration>
好了,基础设施已经铺设成功了,现在迫切需要知道的是我怎么来读出我的设置!
方法如下:
LanguageConfigSection section = (LanguageConfigSection)ConfigurationManager.GetSection("siteSettings/language");
string langs = section.Languages.Langs; //
得到的结果是"en,zh"的字符串
如果你还不明白的话,不用急,我用一张图来道明白!

这只是最简单的配置(只是从web.config中取了一个string值出来),还有比如Providers那种配置就稍显复杂,而且还会用到ProviderBase之类的,在此暂时不多做介绍。这种灵活的config还是蛮有意思的,究竟是怎样来实现这种灵活的配置的呢?框架做了哪些工作?由于时间关系我还没去研究,有兴趣的朋友可以用Reflector去探个究竟。
个人第一篇博客园文章,献丑了。 
                    
                

 
                
            
         浙公网安备 33010602011771号
浙公网安备 33010602011771号