我畫了一張圖,先看一下生產流程。
步驟如下:
獲取匹配當前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進行替換。
foreach (var label in page.Labels)
{
html = html.Replace(label.Template, label.GetHtml());
}
最後輸出被替換掉標籤的html,則頁面生產完成。
我講的都是粗略的框架,開發過程中會出現很多細節性的東西,我就不提了,只提一些比較重要的。下節我們該講如何設計Label了!