设计一个简单的缓存服务类
摘自《应用框架的设计与实现-.net平台》
首先明确设计缓存服务的目的:
1、提供对象存取机制
2、为应用开发者提供简单易用的接口
思路:
设计一个缓存辅助类CacheHelper,里面有几个静态方法就够了,添加缓存对象、删除一个制定的缓存对象、删除一组制定的缓存对象、获取一个指定的缓存对象、获取一组制定的缓存对象等。
简单点在你的CacheHelper类里放一个静态的哈希表,然后写几个方法就可以实现缓存服务了。有时候我们想为缓存对象分类,不过哈希表的key又不能重复。你可以定义一组分类常量,比如说"category1","category2"等,这样用字符串就可以给缓存对象分成若干类了。添加缓存对象的时候用常量分类字符串加上对象ID字符串作为key加进去,比如说"Category1/Object1",里面用一个辅助的xml文档对象来为所有的缓存对象生成一颗对象树,并且为新添加的对象在对象树上添加一个节点,然后创建一个guid作为哈希表的key,并且把这个guid作为新添加节点上的一个属性,这样所有的缓存对象就有层次结构了。 取的时候用这些分类常量字符串加上你的对象ID构建一个xpath字符串,然后在内部辅助的xml文档对象上查询出制定节点,然后获取这个节点的哪个GUID属性,再用这个GUID去从哈希表里取出缓存的对象并返回,强制转换后就可以使用。如果你要获取一组的对象,比如说获取Catgory1分类下所有缓存的对象,就可以根据传入的“Category1”的字符串,这样的xpath字符串再xml文档对象上会获取一组节点,所以就会获取若干个key,从而就可以从哈希表中获取一系列的对象了。
当然了,用哈希表保存缓存对象有一些弊端,如果对象特别多的话,内存消耗会很大,那么你可以定义一个缓存策略的接口,接口有AddObject,RemoveObject,RetriveObject等方法,然后写几个具体类实现这个接口,比如说把缓存对象保存到硬盘或者数据库等。然后在CacheHelper类里生命一个这个接口的私有成员,然后用适配器模式来写CacheHelper类自身的方法。这就简单实现了一个缓存服务了,如果你要加上缓存过期、依赖、缓存策略之类的东西,你还是直接用System.Web下的Cache类或者微软企业库里的缓存模块吧,自己实现简直就是费力不讨好。
我简单写一下伪代码,为缓存对象实现层次结构的代码比较长,但不复杂,没有具体写出来,详细代码请下























































小节:vs2005自带的类图设计器连依赖关系和接口实现的关系也无法表现,所以图也没画出来,只简单写了写代码。另外《应用框架的设计与实现-.net平台》这本书翻译的不错,浅显易懂,各个框架服务的思路很好,又涉及到一些设计模式和.net的基础知识,看起来收获不少,也很轻松。缺点是书中的那个框架没什么新颖的地方。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构