详解webconfig里面的configSections

我们可以把webconfig里面每一个section映射成相关类,做法如下,我们看webconfig的配制

 <configuration>
    <configSections>
     <sectionGroup name="WebApplication2">
          <section name="aaa" type="WebApplication2.Class1, WebApplication2" />
     </sectionGroup>
    </configSections>
    <WebApplication2>
     <aaa>
  <add key="A" value="aaa" />
  <add key="B" value="bbb" />
     </aaa>
    </WebApplication2>
</configuration>

我们利用
ConfigurationSettings.GetConfig("WebApplication2/aaa");访问

类型“WebApplication2.Class1”不从“System.Configuration.IConfigurationSectionHandler”继承。
新建一个类WebApplication2.Class1类继承System.Configuration.IConfigurationSectionHandler
只需要实现一个方法
public object Create(object parent, object configContext, System.Xml.XmlNode section)
{
 return  new DataColumn();//随便反回一个什么东西
}
这时ConfigurationSettings.GetConfig("WebApplication2/aaa");就返回了个DataColumn
在实验过程中发现,程序第一次运行的时候可以调试到Create这个方法,第二次运行的时候就调试不到了
(也许存在某个地方了)
这还不是我们想要的
我们看一下第一次访问时调试到的Create方法中,运行时传进来的几个参数
parent=null
configContext=WebApplication2
section=<add key="A" value="aaa" /><add key="B" value="bbb" />
目前发现,只要webconfig改了,也可以调试到Create,看来运行时每次都会判断webconfig改了没有

有了configContext和section我们一定是可以知道key和value的,怎么做呢
利用System.Collections.Specialized.NameValueCollection,NameValueSectionHandler这两个类
NameValueSectionHandler 这个类也继承IConfigurationSectionHandler
反编译可以看出NameValueSectionHandler 的creater方法把参数section的结果转化成了一个集合
就是NameValueCollection
所以我们可以写下面的代码
NameValueCollection tem;
NameValueSectionHandler baseHandler = new NameValueSectionHandler();
tem=(NameValueCollection)baseHandler.Create(parent,configContext,section);
然后
属性a=tem["A"];
属性b=tem["B"];
属性的赋值就不用多写了
例子如下
using System;
using System.Configuration;
using System.Data;
using System.Collections.Specialized;
namespace WebApplication2
{
 /// <summary>
 /// Class1 的摘要说明。
 /// </summary>
 public class Class1:IConfigurationSectionHandler
 {
  static string  a;
  static string  b;
  public Class1()
  {
   //
   // TODO: 在此处添加构造函数逻辑
   //
  }
  #region IConfigurationSectionHandler 成员

  public object Create(object parent, object configContext, System.Xml.XmlNode section)
  {
   NameValueCollection tem;
   NameValueSectionHandler baseHandler = new NameValueSectionHandler();
   tem=(NameValueCollection)baseHandler.Create(parent,configContext,section);
   
   a=tem["A"];
   b=tem["B"];
   return null;
  }

  #endregion
  public static string A
  {
   get
   {
    return a;
   }
   set
   {
    a=value;
   } 
  }
  public static string B
  {
   get
   {
    return b;
   }
   set
   {
    b=value;
   } 
  }
 }
}
然后我们在Global.asax里面执行一下
ConfigurationSettings.GetConfig("WebApplication2/aaa");
目的是让他执行一下create,赋一下属性值
我们就可以用class1.A来访问节点了.
就可以返回一个和节点相对应的类了


其实我觉得很怪的是,如果不反编译我怎么知道(NameValueCollection)baseHandler.Create

(parent,configContext,section);这么写

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值