CMS系統模版引擎設計(2):頁面生產流程

上節我們介紹了下基本的幾個類。下面我們來講下本CMS系統的運行機制。
一個Url請求過來,我們的CMS系統就要對URL進行分析,知道其Domain屬於哪個Site,Url符合哪個Page的訪問規則,然後再把Page的Template裏的Label進行行替換。
如何攔截Url請求呢? 那就是HttpModule。
自定義一個CMSHttpModule:IHttpModule,在config裏增加HttpModule的配置即可。

   我畫了一張圖,先看一下生產流程。

    

 

步驟如下:

  獲取匹配當前domain的Site,如果匹配不到,說明數據庫中不存在這個Site。那就只能輸出空信息了。
  【注意】如果你想讓你的URL訪問沒有後綴,那必須添加“通配符映射”,並且不能“檢查文件是否存在”,什麼是通配符?即使所有的URL格式,不管是什麼後最,有沒有後綴,都會走ASP.NET的 ISAPI篩選器。也就是都會走我們定義的HttpModule,包括頁面內的圖片、js等靜態資源。所以我們必須過濾掉不想處理的後綴,這些後綴可以是針對每個Site配置,也可以針對全局配置,所以我們還需要給Site類增加一個Config屬性,並且定義一個Config類。

    public class Config
    {
        private IDictionary<string, string> _configs;

        public string this[string key]
        {
            get
            {
                return _configs != null && _configs.ContainsKey(key) ? _configs[key] : string.Empty;
            }
            set
            {
                if (_configs == null)
                {
                    _configs = new Dictionary<string, string>();
                }

                if (_configs.ContainsKey(key))
                    _configs[key] = value;
                else
                    _configs.Add(key, value);
            }
        }
    }

Site獲取ConfigValue的邏輯是先從自己的Config獲取,如果沒有再去Global的config獲取。爲什麼需要Config呢?因爲不同的站點可能需要自定義一些變量到前臺使用。

  好了,過濾說完了,就該獲取Page了。

  根據URL拿Page實例,Page也需要用hashtable來緩存,因爲這個獲取實例的請求實在是太大了,複雜度也要降到O(1)。

    如果page是null,說明數據庫不存在這個Page,所以要跳出HttpModule,讓IIS接手繼續處理。

  如果存在,則需要判斷Page是否緩存,我們這裏緩存其實就是生成靜態頁,如果緩存了,則根據URL生成靜態頁文件名,再去查找是否存在這個文件,如果存在還要判斷文件的創建時間是否過期。如果過期了,我們就得重新寫入一個新文件,通過返回舊文件,等新文件創建成功後覆蓋掉舊文件(讀寫分離)。

  如果不是緩存,則獲取Page.Template.Content,然後循環Labels,對Content進行替換。

    var html = page.Template.Content;
    
foreach (var label in page.Labels)
    {
        html 
= html.Replace(label.Template, label.GetHtml());
    }

 

   最後輸出被替換掉標籤的html,則頁面生產完成。

  我講的都是粗略的框架,開發過程中會出現很多細節性的東西,我就不提了,只提一些比較重要的。下節我們該講如何設計Label了! 


發佈了42 篇原創文章 · 獲贊 191 · 訪問量 18萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章