ConfigurationSettings相关
自定义节点
appSettings估计是我们用得最多的配置节点。如果我自己也有类似appSettings的节点,如
自定义节点的处理程序
如果我们的节点不是appSettings的形式呢?我们可以定义自己的SectionHandler,只需实现System.Configuration.IConfigurationSectionHandler接口。该接口只有一个方法
取出
取出是很容易的事,在我们愿意的地方加使用以下代码
我尝试执行多次的
appSettings估计是我们用得最多的配置节点。如果我自己也有类似appSettings的节点,如
<jobSettings>
<add key="HtmlDoFold" value="D:\Magazine\Mag.Web.App\htmlcache" />
</jobSettings>
该如何做呢?appSettings是使用System.Configuration.NameValueSectionHandler来处理的,我们这个节点也可以用他来处理,但需要在configSections定义<add key="HtmlDoFold" value="D:\Magazine\Mag.Web.App\htmlcache" />
</jobSettings>
<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)<section name="jobSettings" type="System.Configuration.NameValueSectionHandler, System, Version=1.0.3300.0,Culture=neutral, PublicKeyToken=b77a5c561934e089" />
</configSections>
无法创建 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>
<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;
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为自定义类
}
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;
事件依然只有一条!这样不好?没有什么好不好的,机制如此而已。好的,程序快了;不好地,中途修改配置文件程序一般不会响应修改。JobSetting sets = (JobSetting)obj;