缓存篇(Cache)~第一回 使用static静态成员实现服务器端缓存(导航面包屑)
今天写缓存篇的第一篇文章,在写完目录后,得到了一些朋友的关注,这给我之后的写作带来了无穷的力量,在这里,感谢那几位伙伴,哈哈!
书归正传,今天我带来一个Static静态成员的缓存,其实它也不是什么缓存,就是C#语言里的一个特性,静态成员在被初始化后它将不会再被执行,即,他里面的内容只会被执行一次,直到你的网站被重启后(只考虑在单线程情况下)。相信大家都在做网站时,遇到了网站导航面包屑功能点吧,一般,我们把它写死在页面上,这种作法没有任何可扩展性和可维护性,所以,今天我们要改善一下这个功能点,使用的技术就是静态成员缓存和树型结构。
先看一下导航的结构
/// <summary> /// 导航面包 /// </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; } }
下面这段代码就是实现导航的核心,它对外提供一个唯一的访问点,所以,和两个公开的方法,一个是GetBanner,用来返回当前URL对应的导航完整对象(包括祖宗对象),GenerateStandardBanner方法返回一个标准的导航,当前,具体的项目,你可以自己
去实现它。
/// <summary> /// 导航生产类 /// </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 = "关于我们", Parent = null, ParentID = 1, Url = "/Home/About" }); Instance.Add(new BannerBread { ID = 3, DisplayTitle = "联系我们", Parent = null, ParentID = 1, Url = "/Home/Contact" }); } /// <summary> /// 得到当前URL的祖宗节点 /// </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> /// 标准的导航,程序开发人员可以根据自己的需要,在具体项目中去定义它 /// </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) : "未找到导航项"; } /// <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); } } }
上面的代码中,对于导航数据的部分,我选择了静态数据,当然,真实的项目中,需要将这块放到数据库里,以便于后期维护,一般地,我们可以在布局页去调用它来实现导航显示的功能,非常方便,下面是运行后的效果截图
对于具体的显示,我们的前台显示可以自己去组装,上面显示的只是一种标准的形式,即由GenerateStandardBanner方法提供的形式。
分类:
其它 / 系统架构
, 其它 / ASP.NET
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 记一次.NET内存居高不下排查解决与启示
2012-10-08 分层中的~条件过滤~每个层对于“条件过滤”的职责