ConfigurationSettings相关

自定义节点

appSettings估计是我们用得最多的配置节点。如果我自己也有类似appSettings的节点,如
<jobSettings>
        
<add key="HtmlDoFold" value="D:\Magazine\Mag.Web.App\htmlcache" />
</jobSettings>
该如何做呢?appSettings是使用System.Configuration.NameValueSectionHandler来处理的,我们这个节点也可以用他来处理,但需要在configSections定义
<configSections>        
        
<section name="jobSettings" type="System.Configuration.NameValueSectionHandler, System, Version=1.0.3300.0,Culture=neutral, PublicKeyToken=b77a5c561934e089" />
</configSections>
可能会有人说type="System.Configuration.NameValueSectionHandler, System"就OK了,不需要增加后面那么多繁杂的字符;开始我也这样认为,可让我吃尽苦头。我的情况是一开始程序是可以的,后来我加了其他的配置节点,出现了这样的错误。(2009年补充,可能项目同时引用了2.0和3.5的相关dll)
无法创建 System.Configuration.NameValueSectionHandler,System
我以为我加入的节点让程序出现这个错误了,最终只剩下上面的节点的时候,错误依然存在,直到我加入完整的说明
<section name="jobSettings" type="System.Configuration.NameValueSectionHandler, System, Version=1.0.3300.0,Culture=neutral, PublicKeyToken=b77a5c561934e089" />

自定义节点的处理程序

如果我们的节点不是appSettings的形式呢?我们可以定义自己的SectionHandler,只需实现System.Configuration.IConfigurationSectionHandler接口。该接口只有一个方法
public object Create(object parent, object configContext, XmlNode section)
很明显,就是把节点的xml结构交到我们的类来处理,并构造一个任意我们愿意的类的实例返回。写完这个类,同样需要在configSections定义。加上上面的例子,我们完整的config文件就是以下这个样子
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    
<configSections>        
        
<section name="jobSettings" type="System.Configuration.NameValueSectionHandler, System, Version=1.0.3300.0,Culture=neutral, PublicKeyToken=b77a5c561934e089" />
        
<section name="jobsSettings" type="Mag.Windows.MainSrv.JobSettingSectionHandler, Mag.Windows.MainSrv" />
    
</configSections>
    
<jobSettings>
        
<add key="HtmlDoFold" value="D:\Magazine\Mag.Web.App\htmlcache" />
    
</jobSettings>
    
<jobsSettings>
        
<Job>
            
<Interval>0</Interval>
            
<WorkAt>03:00</WorkAt> 
            
<WorkBy>Mag.Web.RewriteTools.HtmlCache.HtmlDo,Mag.Web.RewriteTools.HtmlCache</WorkBy>
        
</Job>
    
</jobsSettings>
</configuration>

取出

取出是很容易的事,在我们愿意的地方加使用以下代码
object o = System.Configuration.ConfigurationSettings.GetConfig("jobSettings");
System.Collections.Specialized.NameValueCollection appSettings 
= (System.Collections.Specialized.NameValueCollection)o;
//自己定义的
object obj = System.Configuration.ConfigurationSettings.GetConfig("jobsSettings");
JobSetting sets 
= (JobSetting)obj;

要清楚的

在第一次取出时,.net会去读取程序的配置文件。程序运行过程中如果读取过某个节点,余下时间就不会读取了。举个例子,在JobSettingSectionHandler的Create方法中我们加入事件的记录

JobCollection jobs = new JobCollection();
foreach(XmlNode node in section.ChildNodes)
{
    
if(node.Name.ToLower()!="job")
        
throw new Exception("节点格式错误");

    Job job 
= new Job();
    
//TODO:读取点击初始化各值
    jobs.Add(job);                
//每个节点记录一次事件
    Log.AddEvent("JobSectionHandler","job work at " + job.workAt);//Log为自定义类
}


我尝试执行多次的
object obj = System.Configuration.ConfigurationSettings.GetConfig("jobsSettings");
JobSetting sets 
= (JobSetting)obj;                
事件依然只有一条!这样不好?没有什么好不好的,机制如此而已。好的,程序快了;不好地,中途修改配置文件程序一般不会响应修改。


 

posted @ 2007-01-19 10:10  生命体验之kevin-Y  阅读(2087)  评论(0编辑  收藏  举报