【風語·深藍 】.NET 2.0的自定義配置檔案體系初探

iDotNetSpace發表於2008-06-11
以前在1.1.的時代我們為了寫一個自定義配置,需要實現System.Configuration.IConfigurationSectionHandler介面,然後用System.Configuration.ConfigurationSettings.AppSettings.Get()方法去獲取配置內容。在實現System.Configuration.IConfigurationSectionHandler的過程中會進行大量繁瑣的XML節操作,如果希望Get()方法返回一個強型別的配置實體物件,還需要寫一個相應的類。這些工作枯燥而且工作量很大,特別是在一個配置很複雜的時候。
      並且,1.1中的配置檔案對於程式來說是隻讀的,若配置檔案一旦發生改變怎會引發應用程式重啟。

      而現在,2.0提供了全新的自定義配置檔案構建方式,支援強型別的配置屬性,並提供了程式碼對配置檔案進行動態修改的機制。我對其作了一些初步的研究,在這裡拋磚引玉了。


  1. 首先我們來看看最簡單的情況如何處理:

    【風語·深藍 】.NET 2.0的自定義配置檔案體系初探xml version="1.0" encoding="utf-8" ?>
    【風語·深藍 】.NET 2.0的自定義配置檔案體系初探
    <configuration>
    【風語·深藍 】.NET 2.0的自定義配置檔案體系初探  
    <configSections>
    【風語·深藍 】.NET 2.0的自定義配置檔案體系初探      
    <section name="RemotingCompress" type="Xrinehart.Framework.CommSupport.Section.RemotingCompressSection, ConfigManagement" 
    【風語·深藍 】.NET 2.0的自定義配置檔案體系初探               allowDefinition
    ="Everywhere" allowExeDefinition="MachineToApplication" restartOnExternalChanges="true"/>
    【風語·深藍 】.NET 2.0的自定義配置檔案體系初探  
    configSections>
    【風語·深藍 】.NET 2.0的自定義配置檔案體系初探  
    <RemotingCompress CompressLevel="DEFAULT_COMPRESSION" CompressCacheSize="1024" UnCompressCacheSize="1024" MinCompressSize="0">
    【風語·深藍 】.NET 2.0的自定義配置檔案體系初探configuration>

    只有一個配置節:RemotingCompress,擁有4個屬性CompressLevel、CompressCacheSize、UnCompressCacheSize、MinCompressSize。

    我們需要實現一個從System.Configuration.ConfigurationSection基類繼承的配置類,在2.0裡配置資訊實體和配置識別都在一個類中,我們先來看程式碼:
    【風語·深藍 】.NET 2.0的自定義配置檔案體系初探using System;
    【風語·深藍 】.NET 2.0的自定義配置檔案體系初探
    using System.Collections.Generic;
    【風語·深藍 】.NET 2.0的自定義配置檔案體系初探
    using System.Text;
    【風語·深藍 】.NET 2.0的自定義配置檔案體系初探
    using System.Configuration;
    【風語·深藍 】.NET 2.0的自定義配置檔案體系初探
    【風語·深藍 】.NET 2.0的自定義配置檔案體系初探
    namespace Xrinehart.Framework.CommSupport.Section
    【風語·深藍 】.NET 2.0的自定義配置檔案體系初探
    {
    【風語·深藍 】.NET 2.0的自定義配置檔案體系初探    
    /// 
    【風語·深藍 】.NET 2.0的自定義配置檔案體系初探    
    /// 壓縮率級別的列舉
    【風語·深藍 】.NET 2.0的自定義配置檔案體系初探    
    /// 

    【風語·深藍 】.NET 2.0的自定義配置檔案體系初探    public enum Deflater 
    【風語·深藍 】.NET 2.0的自定義配置檔案體系初探    
    {
    【風語·深藍 】.NET 2.0的自定義配置檔案體系初探        
    /// 
    【風語·深藍 】.NET 2.0的自定義配置檔案體系初探        
    /// 最佳壓縮效果, 速度慢
    【風語·深藍 】.NET 2.0的自定義配置檔案體系初探        
    /// 

    【風語·深藍 】.NET 2.0的自定義配置檔案體系初探        BEST_COMPRESSION = 9
    【風語·深藍 】.NET 2.0的自定義配置檔案體系初探        
    /// 
    【風語·深藍 】.NET 2.0的自定義配置檔案體系初探        
    /// 預設壓縮率, 壓縮速度比最高(推薦)
    【風語·深藍 】.NET 2.0的自定義配置檔案體系初探        
    /// 

    【風語·深藍 】.NET 2.0的自定義配置檔案體系初探        DEFAULT_COMPRESSION = -1,
    【風語·深藍 】.NET 2.0的自定義配置檔案體系初探        
    /// 
    【風語·深藍 】.NET 2.0的自定義配置檔案體系初探        
    /// 強化壓縮率,速度較慢
    【風語·深藍 】.NET 2.0的自定義配置檔案體系初探        
    /// 

    【風語·深藍 】.NET 2.0的自定義配置檔案體系初探        DEFLATED = 8,
    【風語·深藍 】.NET 2.0的自定義配置檔案體系初探        
    /// 
    【風語·深藍 】.NET 2.0的自定義配置檔案體系初探        
    /// 最佳速度壓縮率,速度最快(寬頻推薦)
    【風語·深藍 】.NET 2.0的自定義配置檔案體系初探        
    /// 

    【風語·深藍 】.NET 2.0的自定義配置檔案體系初探        BEST_SPEED = 1
    【風語·深藍 】.NET 2.0的自定義配置檔案體系初探        
    /// 
    【風語·深藍 】.NET 2.0的自定義配置檔案體系初探        
    /// 不壓縮
    【風語·深藍 】.NET 2.0的自定義配置檔案體系初探        
    /// 

    【風語·深藍 】.NET 2.0的自定義配置檔案體系初探        NO_COMPRESSION =0 
    【風語·深藍 】.NET 2.0的自定義配置檔案體系初探    }
    ;
    【風語·深藍 】.NET 2.0的自定義配置檔案體系初探
    【風語·深藍 】.NET 2.0的自定義配置檔案體系初探    
    /// 
    【風語·深藍 】.NET 2.0的自定義配置檔案體系初探    
    /// RemotingCompress配置節類
    【風語·深藍 】.NET 2.0的自定義配置檔案體系初探    
    /// 

    【風語·深藍 】.NET 2.0的自定義配置檔案體系初探    public sealed class RemotingCompressSection : System.Configuration.ConfigurationSection
    【風語·深藍 】.NET 2.0的自定義配置檔案體系初探    
    {
    【風語·深藍 】.NET 2.0的自定義配置檔案體系初探        
    // 該配置檔案只讀
    【風語·深藍 】.NET 2.0的自定義配置檔案體系初探
            private static bool _ReadOnly = true;
    【風語·深藍 】.NET 2.0的自定義配置檔案體系初探        
    【風語·深藍 】.NET 2.0的自定義配置檔案體系初探        
    public RemotingCompressSection()
    【風語·深藍 】.NET 2.0的自定義配置檔案體系初探        
    {
    【風語·深藍 】.NET 2.0的自定義配置檔案體系初探        }

    【風語·深藍 】.NET 2.0的自定義配置檔案體系初探
    【風語·深藍 】.NET 2.0的自定義配置檔案體系初探        
    private new bool IsReadOnly
    【風語·深藍 】.NET 2.0的自定義配置檔案體系初探        
    {
    【風語·深藍 】.NET 2.0的自定義配置檔案體系初探            
    get
    【風語·深藍 】.NET 2.0的自定義配置檔案體系初探            
    {
    【風語·深藍 】.NET 2.0的自定義配置檔案體系初探                
    return _ReadOnly;
    【風語·深藍 】.NET 2.0的自定義配置檔案體系初探            }

    【風語·深藍 】.NET 2.0的自定義配置檔案體系初探        }

    【風語·深藍 】.NET 2.0的自定義配置檔案體系初探
    【風語·深藍 】.NET 2.0的自定義配置檔案體系初探        
    private void ThrowIfReadOnly(string propertyName)
    【風語·深藍 】.NET 2.0的自定義配置檔案體系初探        
    {
    【風語·深藍 】.NET 2.0的自定義配置檔案體系初探            
    if (IsReadOnly)
    【風語·深藍 】.NET 2.0的自定義配置檔案體系初探                
    throw new ConfigurationErrorsException(
    【風語·深藍 】.NET 2.0的自定義配置檔案體系初探                    
    "The property " + propertyName + " is read only.");
    【風語·深藍 】.NET 2.0的自定義配置檔案體系初探        }

    【風語·深藍 】.NET 2.0的自定義配置檔案體系初探
    【風語·深藍 】.NET 2.0的自定義配置檔案體系初探        
    protected override object GetRuntimeObject()
    【風語·深藍 】.NET 2.0的自定義配置檔案體系初探        
    {
    【風語·深藍 】.NET 2.0的自定義配置檔案體系初探            
    // To enable property setting just assign true to
    【風語·深藍 】.NET 2.0的自定義配置檔案體系初探            
    // the following flag.
    【風語·深藍 】.NET 2.0的自定義配置檔案體系初探
                _ReadOnly = true;
    【風語·深藍 】.NET 2.0的自定義配置檔案體系初探            
    return base.GetRuntimeObject();
    【風語·深藍 】.NET 2.0的自定義配置檔案體系初探        }

    【風語·深藍 】.NET 2.0的自定義配置檔案體系初探
    【風語·深藍 】.NET 2.0的自定義配置檔案體系初探        
    所有配置屬性

相關文章