技术开发 频道

揭开.NET 2.0配置隐藏的秘密

         以同样的方式配置节组也可以定义多次。这使得一个通常的自定义配置结构在同一个应用程序中,同时以多种方式使用,而且使得自定义配置可以重用。因为可能在一个.config文件中一个配置节定义多次,最终实现上述的模式包括一个简单的实例缓存。每次用不同的definedName调用GetSection(string),将返回不同的配置节对象且存储在缓存中。连续以相同的名字调用将返回相同的缓存实例。这种模式的另一个重要方面是缺少为两个新版本的GetSection(以一个Configuration对象作为参数的GetSection方法)的缓存。用Configuration对象比用ConfigurationManager或WebConfigurationManager花费更大的开销。通过配置管理器(manager)调用GetSection()方法将完全缓存节,而通过Configuration对象调用将导致节每次都要被解析。一般来说,Configuration对象只有当需要保存配置更改是才使用。配置管理器类应该被用来访问读取配置。这将保证使用配置设置时性能非常好的。

  最后一个秘诀是关于性能的主题。除非你实现高级的配置节或元素,包括事件通知,缓存配置设置在变量中通常沮丧的(行不通的)。更多关于这个的讨论将在下面的高级部分,首先考虑以下非常简单的情景:

public class SomeProgram

  {

  
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)相对廉价的操作,因此上述代码可以重写成如下:

public class SomeProgram
{
    
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);
    }
}
0
相关文章