返回目录

今天写缓存篇的第一篇文章,在写完目录后,得到了一些朋友的关注,这给我之后的写作带来了无穷的力量,在这里,感谢那几位伙伴,哈哈!

书归正传,今天我带来一个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 = , DisplayTitle = "首页", Parent = null, ParentID = , Url = "/" });
Instance.Add(new BannerBread { ID = , DisplayTitle = "关于我们", Parent = null, ParentID = , Url = "/Home/About" });
Instance.Add(new BannerBread { ID = , DisplayTitle = "联系我们", Parent = null, ParentID = , 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(, "/<span><a href='" + entity.Url + "'>" + entity.DisplayTitle + "</a></span>");
entity = entity.Parent;
}
return str.ToString().StartsWith("/") ? str.ToString().Substring() : "未找到导航项";
}
/// <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);
}
} }

上面的代码中,对于导航数据的部分,我选择了静态数据,当然,真实的项目中,需要将这块放到数据库里,以便于后期维护,一般地,我们可以在布局页去调用它来实现导航显示的功能,非常方便,下面是运行后的效果截图

aaarticlea/png;base64,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" alt="" />

对于具体的显示,我们的前台显示可以自己去组装,上面显示的只是一种标准的形式,即由GenerateStandardBanner方法提供的形式。

返回目录

缓存篇(Cache)~第一回 使用static静态成员实现服务器端缓存(导航面包屑)的更多相关文章

  1. 缓存篇(Cache)~第二回 使用static静态成员实现服务器端缓存(导航面包屑)~续

    返回目录 在写完首篇cache文章后,有些朋友给我来信,希望可以使用JS的方法来实现这个导航功能,所以,才有了这篇文章,JS与C#不同,它虽然有引用类型,但它不具备一些引用类型的特性,如它的方法参数为 ...

  2. 缓存篇(Cache)~大话开篇

    回到占占推荐博客索引 闲话杂淡 想写这篇文章很久了,但总是感觉内功还不太够,总觉得,要写这种编程领域里的心法(内功)的文章,需要有足够的实践,需要对具体领域非常了解,才能写出来.如今,感觉自己有写这种 ...

  3. 缓存篇(Cache)~第三回 HttpModule实现网页的文件级缓存

    返回目录 再写完缓存篇第一回之后,得到了很多朋友的好评和来信,所以,决定加快步伐,尽快把剩下的文章写完,本篇是第三回,主要介绍使用HttpModule实现的文件级缓存,在看本文之前,大家需要限度Htt ...

  4. 缓存篇~第七回 Redis实现基于方法签名的数据集缓存(可控更新,分布式数据缓存)

    返回目录 本篇文章可以说是第六回 Microsoft.Practices.EnterpriseLibrary.Caching实现基于方法签名的数据集缓存(可控更新,WEB端数据缓存)的续篇,事实上,有 ...

  5. 缓存篇~第六回 Microsoft.Practices.EnterpriseLibrary.Caching实现基于方法签名的数据集缓存

    返回目录 这一讲中主要是说EnterpriseLibrary企业级架构里的caching组件,它主要实现了项目缓存功能,它支持四种持久化方式,内存,文件,数据库和自定义,对于持久化不是今天讨论的重要, ...

  6. 缓存篇~第八回 Redis实现基于方法签名的数据集缓存~续(优化缓存中的key)

    返回目录 上一讲主要是说如何将数据集存储到redis服务器里,而今天主要说的是缓存里的键名,我们习惯叫它key. redis或者其它缓存组件实现的存储机制里,它将很多方法对应的数据集存储在一个公共的空 ...

  7. (转)高性能网站架构之缓存篇—Redis集群搭建

    看过 高性能网站架构之缓存篇--Redis安装配置和高性能网站架构之缓存篇--Redis使用配置端口转发 这两篇文章的,相信你已经对redis有一定的了解,并能够安装上,进行简单的使用了,但是在咱们的 ...

  8. 前端技巧:禁止浏览器static files缓存篇(转)

    前端技巧:禁止浏览器static files缓存篇 由于CSS/JS文件经常需要改动,前端调试时是不希望浏览器缓存这些文件的. 本文记录博主的经验. Meta法 目前在chrome调试还没有遇到问题, ...

  9. Spring Boot 揭秘与实战(二) 数据缓存篇 - Redis Cache

    文章目录 1. Redis Cache 集成 2. 源代码 本文,讲解 Spring Boot 如何集成 Redis Cache,实现缓存. 在阅读「Spring Boot 揭秘与实战(二) 数据缓存 ...

随机推荐

  1. LoopbackJS 生成对应 Oracle 视图的model

    StrongLoop Arc 工具中的discover model 目前只能discover 表, Oracle数据库中的视图经测试并不能显示在列表中. 无奈之下,暂时只能采取替代方案. 解决方法: ...

  2. nodejs中标准包的制作,上传,安装及卸载方法

    一:如何制作一个标准包? 为了规范化,基本遵循CommonJS规范,首先约定: 包的使用: 所有模块放在一个文件夹(包名) 包放在当前项目中的node_modules文件夹下 包中定义一个index. ...

  3. java 线程安全不线程不安全

    经常看到一些类,有的说线程安全,有的说线程不安全,顿时懵逼. 线程安全不安全,主要是在多线程执行的情况下,如果由于线程之间抢占资源而造成程序的bug即为线程不安全,下面就拿arraylist 和Vec ...

  4. (转)使用Node.js+Socket.IO搭建WebSocket实时应用

    Web领域的实时推送技术,也被称作Realtime技术.这种技术要达到的目的是让用户不需要刷新浏览器就可以获得实时更新.它有着广泛的应用场景,比如在线聊天室.在线客服系统.评论系统.WebIM等. W ...

  5. jquery ajax post 中文乱码解决

    jquery ajax post 方式默认传递的是UFT-8字符,即使页面设置了gbk编码也无效.字符传到后台时如果后台设置的gbk或者其他编码,就会出现乱码.解决很容易,将后台页面设置成UTF-8编 ...

  6. poj 3067 - Japan(树状数组)

    先按第一个数从大到小排序,相等的情况下,第二个数按照从大到小排序..... 预处理后,照着树状数组写就行了... 注意:k的最大值应取1000*1000 代码如下: include <cstdi ...

  7. Spring声明式事务管理基于tx/aop命名空间

    目的:通过Spring AOP 实现Spring声明式事务管理; Spring支持编程式事务管理和声明式事务管理两种方式. 而声明式事务管理也有两种常用的方式,一种是基于tx/aop命名空间的xml配 ...

  8. Sphinx : 高性能SQL全文检索引擎

    Sphinx的特点 快速创建索引:3分钟左右即可创建近100万条记录的索引,并且采用了增量索引的方式,重建索引非常迅速. 闪电般的检索速度:尽管是1千万条的大数据量,查询数据的速度也在毫秒级以上,2- ...

  9. [ASE][Daily Scrum]11.28

    昨天基本上已经完成了sprint2的task, 现在剩下一些bug还需要来修正, 然后我正式加入码代码的大军啦~ Shilin Liu  显示聊天框 Zhao Li     搭建聊天服务器 Yimin ...

  10. Android Studio 无法启动模拟器的一种可能是你装的是Ghost版的系统

    我遇到的问题是,打开模拟器,进度条走到最后,突然出现了emulator error,然后模拟器就无法启动(不好意思当时没有截图).我是在Ghost版 win7系统下运行Android Studio 的 ...