缓存篇(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方法提供的形式。

本文转自博客园张占岭(仓储大叔)的博客,原文链接:缓存篇(Cache)~第一回 使用static静态成员实现服务器端缓存(导航面包屑),如需转载请自行联系原博主。

目录
相关文章
|
3月前
|
缓存 监控 定位技术
|
6月前
|
缓存 应用服务中间件 nginx
Web服务器的缓存机制与内容分发网络(CDN)
【8月更文第28天】随着互联网应用的发展,用户对网站响应速度的要求越来越高。为了提升用户体验,Web服务器通常会采用多种技术手段来优化页面加载速度,其中最重要的两种技术就是缓存机制和内容分发网络(CDN)。本文将深入探讨这两种技术的工作原理及其实现方法,并通过具体的代码示例加以说明。
584 1
|
6月前
|
存储 缓存 NoSQL
【Azure Redis 缓存】关于Azure Cache for Redis 服务在传输和存储键值对(Key/Value)的加密问题
【Azure Redis 缓存】关于Azure Cache for Redis 服务在传输和存储键值对(Key/Value)的加密问题
|
6月前
|
缓存 弹性计算 NoSQL
【Azure Redis 缓存 Azure Cache For Redis】Redis连接池
【Azure Redis 缓存 Azure Cache For Redis】Redis连接池
|
4月前
|
缓存 NoSQL Ubuntu
大数据-39 Redis 高并发分布式缓存 Ubuntu源码编译安装 云服务器 启动并测试 redis-server redis-cli
大数据-39 Redis 高并发分布式缓存 Ubuntu源码编译安装 云服务器 启动并测试 redis-server redis-cli
76 3
|
5月前
|
XML 存储 缓存
Squid 缓存服务器配置
Squid 缓存服务器配置
178 0
|
6月前
|
缓存 NoSQL 网络安全
【Azure Redis 缓存】使用开源工具redis-copy时遇见6379端口无法连接到Redis服务器的问题
【Azure Redis 缓存】使用开源工具redis-copy时遇见6379端口无法连接到Redis服务器的问题
|
6月前
|
缓存 NoSQL Redis
【Azure Redis 缓存】Azure Cache for Redis 服务的导出RDB文件无法在自建的Redis服务中导入
【Azure Redis 缓存】Azure Cache for Redis 服务的导出RDB文件无法在自建的Redis服务中导入
|
6月前
|
缓存 开发框架 NoSQL
【Azure Redis 缓存】VM 里的 Redis 能直接迁移到 Azure Cache for Redis ? 需要改动代码吗?
【Azure Redis 缓存】VM 里的 Redis 能直接迁移到 Azure Cache for Redis ? 需要改动代码吗?
|
6月前
|
缓存 NoSQL Unix
【Azure Redis 缓存】Azure Cache for Redis 中如何快速查看慢指令情况(Slowlogs)
【Azure Redis 缓存】Azure Cache for Redis 中如何快速查看慢指令情况(Slowlogs)