因為有些項目過大,造成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中要想實現上面的需求會更加復雜,先不說多節點的配置,就是程序中讀取對應語言對應頁面的內容,免不了一堆的條件判斷。
下面是我定義的配置文件:
可以非常好的支持多語言,以及多頁面。
<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信息。純屬集合操作。
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):
public class StaticPageContentConfig
{
public List<LanguageItem> LanguageItems { get; set; }
public static StaticPageContentConfig Data
{
get
{
return WebConfig<StaticPageContentConfig>.DataAccessConfig;
}
}
}
[Serializable]
public class Page
{
public string Name { get; set; }
public string Content { get; set; }
}
[Serializable]
public class LanguageItem
{
public string Name { get; set; }
public List<Page> Pages { get; set; }
}
最后可以這樣訪問:var StaticContentHtml = StaticPageContentConfig.Data.LanguageItems
自定義配置組件優勢:
1:可以支持一些不適用放在web.config中的節點,比如富文本之類。
2:很好的支持集合類型的配置。
3:讀取數據時,不再需要傳入節點名稱的字符串,取而代之是純類對象屬性操作,基本不會因為參數傳遞錯誤,導致程序出現BUG。
web.config方式 :
{
var result = string.Empty;
if (ConfigurationManager.AppSettings[keyWord] != null)
result = ConfigurationManager.AppSettings[keyWord].Trim();
return result;
}
總之:
可以很好的結合web.config本身的優勢以及自定義配置組件的優點,來打造一個比較通用簡單易用的配置功能。