以同样的方式配置节组也可以定义多次。这使得一个通常的自定义配置结构在同一个应用程序中,同时以多种方式使用,而且使得自定义配置可以重用。因为可能在一个.config文件中一个配置节定义多次,最终实现上述的模式包括一个简单的实例缓存。每次用不同的definedName调用GetSection(string),将返回不同的配置节对象且存储在缓存中。连续以相同的名字调用将返回相同的缓存实例。这种模式的另一个重要方面是缺少为两个新版本的GetSection(以一个Configuration对象作为参数的GetSection方法)的缓存。用Configuration对象比用ConfigurationManager或WebConfigurationManager花费更大的开销。通过配置管理器(manager)调用GetSection()方法将完全缓存节,而通过Configuration对象调用将导致节每次都要被解析。一般来说,Configuration对象只有当需要保存配置更改是才使用。配置管理器类应该被用来访问读取配置。这将保证使用配置设置时性能非常好的。
最后一个秘诀是关于性能的主题。除非你实现高级的配置节或元素,包括事件通知,缓存配置设置在变量中通常沮丧的(行不通的)。更多关于这个的讨论将在下面的高级部分,首先考虑以下非常简单的情景:
{
static Main()
{
s_config = MyConfig.GetSection();
s_duration = s_config.Duration;
s_timer = new Timer(
new TimerCallback(),
null,
TimeSpan.Zero
s_duration
);
Console.ReadKey();
s_timer.Dispose();
}
private static MyConfig s_config;
private static Timer s_timer;
private static TimeSpan s_duration;
private static void WriteCurrentTime(object data)
{
Console.WriteLine("The current time is " + DateTime.Now.ToString());
if (s_duration != s_config.Duration)
{
s_duration = s_config.Duration;
s_timer.Change(TimeSpan.Zero, s_duration);
}
}
}
在上面的应用程序中,我们希望如果配置文件更新的话,改变定时器间隔。我们配置节的实例,s_config,将一直保持更新。因此如果在应用程序运行时,.config文件改变,任何改变将被发现并载入到内存中。如果你跟我在文章中一样实现你的配置节,覆写静态构造器和替换属性(properties)集合,这样你的集合将有有高的性能。这使得访问一个配置属性(property)相对廉价的操作,因此上述代码可以重写成如下:
{
static Main()
{
s_config = MyConfig.GetSection();
s_timer = new Timer(
new TimerCallback(),
null,
TimeSpan.Zero
s_config.Duration
);
Console.ReadKey();
s_timer.Dispose();
}
private static MyConfig s_config;
private static Timer s_timer;
private static TimeSpan s_duration;
private static void WriteCurrentTime(object data)
{
Console.WriteLine("The current time is " +
DateTime.Now.ToString());
s_timer.Change(TimeSpan.Zero, s_config.Duration);
}
}