一個比較通用簡單易用的配置功能


   以前寫過兩篇關於如何分離web.config的文章( 如何分割web.config ,  如何分離web.config改進版本, ),至於為什么要分離,我當時的觀點如下:
   
   因為有些項目過大,造成N多配置節存在於web.config中,缺點如下:
      1:不容易管理,當你想查找一個配置節時,望着整頁的code,不知所措,為此你只有ctrl+f來解決。
      2:部署時也及容易出錯,部署人員需要按照你寫的部署文檔,一個一個加,即費時又容易出錯,比如一不小心將其它節點給覆蓋了諸如此類。
      3:在web.config中的配置節的修改會引起站點重啟。
      4:訪問配置節不夠簡單,容易出錯。
      
   朋友 春天在哪里看了文章后,提到:web.config就已經支持分離配置文件了(configSource attribute),同時transform web.config也支持不同configuration。當時沒太在意,正好,最近項目中再次應用到配置文件組件,就順便看了下configSource attribute。
   
   configSource attribute能夠很好的分離多配置節點,至於修改分離后的配置文件是否會引啟站點重啟,我並未了解,未做仔細研究。
   
   這篇主要對比下我的自定義配置文件組件的優勢以及它的適用場景。
   
   適用場景:
  

   1:非環境相關的內容。
      這里先解釋下什么是環境相關以及非環境相關。
      環境相關:上線時需要修改的內容,比如數據庫連接串,郵箱服務器信息等等。
      非環境相關:上線時不需要修改的內容,即和業務邏輯相關的一些配置,開發環境和生產環境值並不一定需要不同。
      
      我不太主張將環境相關的內容也轉移到自定義的配置文件中,比如數據連接串,web.config對數據庫連接串會有更好的加密機制,我們就沒有必要多費勞力去做微軟已經提供的功能。
      
   2: 適用於配置項內容為記錄集形式。
      這里拿我最近的一個項目來分享。
      需求:網站有一個發布靜態文本的功能,比如用戶選擇首頁,然后在富文本編輯器中加載對應頁面默認的文本內容。方便發布,有些頁面只需要隨便修改點內容就可以。
      分析:需要支持多頁面,需要支持多語言。這樣的默認文本配置項比較符合記錄集的概念。
      這種需求,很明顯我們不能放在Web.Config文件中。
      首次是web.config中不適合存放富文本內容,一般情況下,只存放簡單類型的值,其次,在web.config中要想實現上面的需求會更加復雜,先不說多節點的配置,就是程序中讀取對應語言對應頁面的內容,免不了一堆的條件判斷。
      
      下面是我定義的配置文件:
      可以非常好的支持多語言,以及多頁面。

<?xml version= " 1.0 " encoding= " utf-8 " ?>
<StaticPageContentConfig>
  <LanguageItems>
    <LanguageItem>
      <Name>zh-CHS</Name>
      <Pages>
        <Page>
          <Name>Home</Name>
          <Content>
            <![CDATA[
            這里是首頁html
    ]]>
          </Content>
        </Page>
        <Page>
          <Name>Awards</Name>
          <Content>
<![CDATA[
      這里是獎金html
    ]]>
          </Content>
        </Page>       
      </Pages>
    </LanguageItem>
  </LanguageItems>
</StaticPageContentConfig>


    我們在看下,程序如果根據語言以及頁面獲取對應的html信息。純屬集合操作。
   

var StaticContentHtml = WebConfig<StaticPageContentConfig>.DataAccessConfig.LanguageItems.Where(
               P => P.Name ==  " 語言參數 ").FirstOrDefault();
             if ( null != StaticContentHtml)
            {
                 var page = StaticContentHtml.Pages.Where(p => p.Name ==  " 頁面參數 ").FirstOrDefault();
                 if ( null != page)
                {
                    result = page.Content;
                }
            }

            

      上篇文章我曾經對配置節點的訪問有點有遺憾,WebConfig<StaticPageContentConfig>.DataAccessConfig.LanguageItems這種方式不是特別簡單,我認為比較合理的方式:StaticPageContentConfig.LanguageItems。這次想了個比較簡單的辦法,主要是在實體類的定義中做一個變量(static StaticPageContentConfig Data):
   

[Serializable]
     public  class StaticPageContentConfig
    {
         public List<LanguageItem> LanguageItems {  getset; }
          public  static StaticPageContentConfig Data
        {
             get
            {
                 return WebConfig<StaticPageContentConfig>.DataAccessConfig;
            }
           
        }
        
    }
    [Serializable]
     public  class Page
    {
         public  string Name {  getset; }
         public  string Content {  getset; }

    }
    [Serializable]
     public  class LanguageItem
    {
         public  string Name {  getset; }
         public List<Page> Pages {  getset; }
 
    }

    
    最后可以這樣訪問:var StaticContentHtml = StaticPageContentConfig.Data.LanguageItems
    
    自定義配置組件優勢:
    1:可以支持一些不適用放在web.config中的節點,比如富文本之類。
    2:很好的支持集合類型的配置。
    3:讀取數據時,不再需要傳入節點名稱的字符串,取而代之是純類對象屬性操作,基本不會因為參數傳遞錯誤,導致程序出現BUG。

       web.config方式  :

   public  static  string GetAppSetting( string keyWord)
        {
             var result =  string.Empty;
             if (ConfigurationManager.AppSettings[keyWord] !=  null)
                result = ConfigurationManager.AppSettings[keyWord].Trim();
             return result;
        }


      組件方式:StaticPageContentConfig.Data.LanguageItems,不需要傳遞節點名稱。

    總之:

         可以很好的結合web.config本身的優勢以及自定義配置組件的優點,來打造一個比較通用簡單易用的配置功能。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM