BlogSettings
這已經是本系列的第四篇了,以前我多數時間是看文章,自己寫起來才感覺到當博主不容易啊,所以我們無論評論也好,閱讀也好,都要尊重博主的勞動成果。閒話少說,在這篇文章中我們將對BlogEngine.Net的全局配置進行一下分析與探討。關於配置這一部分單獨拿出來做一篇文章實在有些牽強,但是我總覺得這個配置部分比較獨立,而且BlogEngine.Net的設計和實現都有很多可以參考的地方。
在一個企業級應用系統中,對一些系統全局參數進行配置是必不可少的,那麼我們是怎麼處理這些配置的呢?
一般都有以下三步:
1.在業務模塊開發的過程中將一些可變的參量提取出來。
2.當所有業務模塊開發完成時,將這些參量分類存儲起來。
3.開發出相應的管理功能,允許用戶對這些參量進行設置。
相信大多數開發者都是直接操作數據庫中的數據,可能有些比較完善的系統會做出單獨的頁面來給用戶管理使用,本質上也都是直接與數據庫打交道,沒有涉及太多的邏輯,比較直接。不過在BlogEngine.Net的架構模型上這種操作就失效了,我們不可以在BlogEngine.Net的數據庫中修改數據而希望在它的運行系統中體現出來(除非重啟應用),因為BlogEngine.Net的數據庫只是完成數據存儲功能,所有的業務邏輯都在BlogEngine.Core層由對象的狀態維護來完成(可以參考我的第二篇文章)。有人可能會想可不可以進一步開發一種像Asp.Net中Cache那樣對數據庫表的依賴機制,我覺得這個問題要看需求,這種在BlogEngine.Net中似乎沒有什麼太多必要。
那麼BlogEngine.Net的全局設置到底是怎麼實現的呢?
在安裝BlogEngine.Net以後進入後台管理中,我們會看到有很多分類的配置選項,包括主題,語言文化,時區等。這些配置的邏輯處理都是通過BlogEngine.Core中的一個類完成的,那就是BlogSettings。BlogSettings只是完成BlogEngine.Net的全局的配置處理,對於後文講述的Widget的一些具體配置並不在這裡完成,這主要是為了配置獨立的目的,使得Widget可以獨立開發。
BlogSettings與外界交互圖(這個圖使用畫圖程序弄的,大家先湊合著看吧):
在BlogSettings中除了各種配置項的對應屬性以外,還有一個靜態的Changed事件用來通知外部全局配置已經發生了改變,這樣就可以寫出更多擴展來。BlogSettings使用單例模式來實現(一個設計模式的很好的應用,全局配置具有系統唯一性)。
1/**//// <summary>
2/// Public event used to indicate in settings have been changed.
3/// </summary>
4public static event EventHandler<EventArgs> Changed;
5/**//// <summary>
6/// Private member to hold singleton instance.
7/// </summary>
8private static BlogSettings blogSettingsSingleton;
9
10Instance#region Instance
11/**//// <summary>
12/// Gets the singleton instance of the <see cref="BlogSettings"/> class.
13/// </summary>
14/// <value>A singleton instance of the <see cref="BlogSettings"/> class.</value>
15/// <remarks></remarks>
16public static BlogSettings Instance
17{
18 get
19 {
20 if (blogSettingsSingleton == null)
21 {
22 blogSettingsSingleton = new BlogSettings();
23 }
24 return blogSettingsSingleton;
25 }
26}
27#endregion