緩存篇(Cache)~第一回 使用static靜態(tai)成員實現服(fu)務器端(duan)緩存(導(dao)航面包屑)
今(jin)天(tian)寫(xie)緩存篇(pian)的第一篇(pian)文章(zhang),在寫(xie)完目錄(lu)后,得到了一些朋友的關(guan)注,這給我之后的寫(xie)作(zuo)帶來了無窮的力量,在這里,感謝那幾位伙伴(ban),哈哈!
書歸正傳(chuan),今天我(wo)帶(dai)來一(yi)(yi)(yi)個Static靜態成(cheng)員的緩(huan)(huan)存(cun),其實它(ta)(ta)也(ye)不(bu)是什(shen)么緩(huan)(huan)存(cun),就是C#語(yu)言里(li)的一(yi)(yi)(yi)個特(te)性,靜態成(cheng)員在(zai)(zai)被(bei)初始(shi)化(hua)后(hou)它(ta)(ta)將不(bu)會(hui)再被(bei)執(zhi)(zhi)行,即,他里(li)面的內容(rong)只會(hui)被(bei)執(zhi)(zhi)行一(yi)(yi)(yi)次(ci),直到你(ni)的網(wang)站被(bei)重啟后(hou)(只考慮在(zai)(zai)單線程(cheng)情況下)。相(xiang)信(xin)大家都在(zai)(zai)做網(wang)站時,遇(yu)到了網(wang)站導航面包屑功(gong)能(neng)點吧,一(yi)(yi)(yi)般,我(wo)們把它(ta)(ta)寫死在(zai)(zai)頁面上,這種作(zuo)法沒有(you)任(ren)何可擴展(zhan)性和(he)可維(wei)護性,所以,今天我(wo)們要(yao)改善一(yi)(yi)(yi)下這個功(gong)能(neng)點,使(shi)用的技(ji)術就是靜態成(cheng)員緩(huan)(huan)存(cun)和(he)樹型結構。
先看一下導航的結構
/// <summary> /// 導航(hang)面包 /// </summary> public class BannerBread { public string DisplayTitle { get; set; } public string Url { get; set; } public int ID { get; set; } public int ParentID { get; set; } public BannerBread Parent { get; set; } }
下面這(zhe)段(duan)代碼就是實現導(dao)航的(de)核心,它對外提(ti)供一(yi)(yi)(yi)(yi)個唯(wei)一(yi)(yi)(yi)(yi)的(de)訪問點,所以(yi),和兩個公開的(de)方(fang)法(fa),一(yi)(yi)(yi)(yi)個是GetBanner,用來返回(hui)(hui)當(dang)前URL對應的(de)導(dao)航完整(zheng)對象(xiang)(包括祖宗(zong)對象(xiang)),GenerateStandardBanner方(fang)法(fa)返回(hui)(hui)一(yi)(yi)(yi)(yi)個標準的(de)導(dao)航,當(dang)前,具(ju)體的(de)項目,你可以(yi)自己(ji)
去實現它。
/// <summary> /// 導(dao)航生產(chan)類 /// </summary> public static class BannerBreadFactory { /// <summary> /// BannerBread單例實例對象 /// </summary> static readonly List<BannerBread> Instance = new List<BannerBread>(); static BannerBreadFactory() { Instance.Add(new BannerBread { ID = 1, DisplayTitle = "首頁", Parent = null, ParentID = 0, Url = "/" }); Instance.Add(new BannerBread { ID = 2, DisplayTitle = "關于(yu)我們", Parent = null, ParentID = 1, Url = "/Home/About" }); Instance.Add(new BannerBread { ID = 3, DisplayTitle = "聯系我們", Parent = null, ParentID = 1, Url = "/Home/Contact" }); } /// <summary> /// 得到當前(qian)URL的祖宗(zong)節點 /// </summary> /// <param name="url"></param> /// <returns></returns> public static BannerBread GetBanner(string url) { var entity = Instance.FirstOrDefault(i => i.Url.ToUpper() == url.ToUpper()); GetFather(entity); return entity; } /// <summary> /// 標準的(de)導(dao)航,程序開(kai)發人員(yuan)可以根(gen)據自己的(de)需要,在具體項目中去定義它(ta) /// </summary> /// <param name="url"></param> /// <returns></returns> public static string GenerateStandardBanner(string url) { var entity = GetBanner(url); StringBuilder str = new StringBuilder(); while (entity != null) { str.Insert(0, "/<span><a href='" + entity.Url + "'>" + entity.DisplayTitle + "</a></span>"); entity = entity.Parent; } return str.ToString().StartsWith("/") ? str.ToString().Substring(1) : "未找到(dao)導航(hang)項"; } /// <summary> /// 得到祖宗 /// </summary> /// <param name="son"></param> private static void GetFather(BannerBread son) { if (son != null) { son.Parent = Instance.FirstOrDefault(i => i.ID == son.ParentID); GetFather(son.Parent); } } }
上(shang)面的(de)代碼中(zhong),對于(yu)導(dao)航數(shu)(shu)據(ju)的(de)部分,我(wo)選(xuan)擇了(le)靜(jing)態(tai)數(shu)(shu)據(ju),當(dang)然,真實的(de)項目中(zhong),需要將這塊(kuai)放到數(shu)(shu)據(ju)庫里,以便(bian)(bian)于(yu)后(hou)期維護,一般地(di),我(wo)們可以在(zai)布局頁(ye)去(qu)調(diao)用(yong)它來(lai)實現導(dao)航顯示的(de)功能,非常方(fang)便(bian)(bian),下面是(shi)運行后(hou)的(de)效果截圖
對(dui)于具體的(de)顯示(shi),我們的(de)前(qian)臺顯示(shi)可以自己去組裝,上面顯示(shi)的(de)只是一種(zhong)標(biao)準的(de)形式,即由GenerateStandardBanner方(fang)法(fa)提供的(de)形式。