项目架构开发:数据访问层之Cache
数据访问层简单介绍
数据访问层,提供整个项目的数据访问与持久化功能。在分层系统中所有有关数据访问、检索、持久化的任务,最终都将在这一层完成。
来看一个比较经典的数据访问层结构图
大概可以看出如下信息
1、有缓存、日志、异常处理、数据CRUD、查询及数据事务等功能
2、无缝对接如EF、ADO.NET、NH、Dapper等数据访问技术
3、对外只开放接口层,隐藏具体实现,这样就可以解耦业务层与数据访问层
今天斗胆通过一个简单实例来实践一下,如有不妥的地方,欢迎指正
创建接口层,定义可以提供的一些服务接口
这里我们一个有5种服务接口,方法的功能就不介绍了,应该都能看懂
缓存接口:ICache.cs
1 public interface ICache<T> where T : class
2 {
3 IEnumerable<T> Gets(string key);
4 T Get(string key);
5 bool Sets(string key, IEnumerable<T> value, TimeSpan expiresIn);
6 bool Set(string key, T value, TimeSpan expiresIn);
7 bool Remove(string key);
8 }
缓存服务的实现
因为可能支持多种缓存,所以我实现了Web缓存与Redis缓存,这2中缓存分别在项目初期和后期集群中可能会用到
我们来看HttpRuntimeCache.cs (还有一种Web缓存HttpContext.Cache,不够这种只能在Web应用使用,所以一般不推荐)
1 public class HttpRuntimeCache<T> : ICache<T> where T : class2 {3 public HttpRuntimeCache()4 {5 6 }7 8 public T Get(string key)9 {
10 if (System.Web.HttpRuntime.Cache[key] == null)
11 {
12 return default(T);
13 }
14
15 return System.Web.HttpRuntime.Cache[key] as T;
16 }
17
18 public bool Set(string key, T value, TimeSpan expiresIn)
19 {
20 Set(key, value, expiresIn.Seconds);
21 return true;
22 }
23
24 public bool Remove(string key)
25 {
26 System.Web.HttpRuntime.Cache.Remove(key);
27 return true;
28 }
29
30 private void Set(string key, object value, int absoluteSeconds)
31 {
32 System.Web.HttpRuntime.Cache.Insert(key, value, null, DateTime.Now.AddSeconds(absoluteSeconds), TimeSpan.FromSeconds(0));
33 }
34 }
现在缓存功能已经实现了;大家应该很容易想到怎麼使用了,比如在业务层这样使用
1 ICache<User> cache = new HttpRuntimeCache<User>();
2 var user = cache.Get("key");
其实这样是不对的,因为这样的话接口ICache相当于没什么用处,没有起到应有的作用(隔离具体实现)
如果要换另一种缓存实现(比如redis),那还要在所有使用了 new HttpRuntimeCache<User>() 的地方改正过来
这样的耦合要去掉;有2种方式,通过IOC在实例化的时候依赖注入;另一种就是新建一个基础设施层,业务层依赖于这一层
因为业务层肯定是需要调用一些Utilities、Helper等类型的工具类,这个应该是躲不掉的,再怎么接口隔离也去除不了这点
基础设施层的实现
Cache.cs
1 public sealed class Cache<T> where T : class2 {3 private readonly static ICache<T> cacheProvider;4 5 static Cache()6 {7 cacheProvider = ProviderHelper<T>.GetCacheProvider();8 }9
10 public static IEnumerable<T> Gets(string key)
11 {
12 return cacheProvider.Gets(key);
13 }
14
15 public static T Get(string key)
16 {
17 return cacheProvider.Get(key);
18 }
19
20 public static bool Sets(string key, IEnumerable<T> value, TimeSpan expiresIn)
21 {
22 return cacheProvider.Sets(key, value, expiresIn);
23 }
24
25 public static bool Set(string key, T value, TimeSpan expiresIn)
26 {
27 return cacheProvider.Set(key, value, expiresIn);
28 }
29
30 public static bool Remove(string key)
31 {
32 return cacheProvider.Remove(key);
33 }
34 }
ProviderHelper.cs 实现如下图
至此,缓存功能实现完毕,我们新建一个测试项目看看结果
1 [TestClass]2 public class CacheTest3 {4 [TestMethod]5 public void Set()6 {7 var user = new LoginUser()8 {9 Id = Guid.NewGuid(),
10 LoginName = "LoginName",
11 IsEnabled = 1,
12 Password = "mima1987",
13 CreateTime = DateTime.Now
14 };
15
16 Cache<LoginUser>.Set("UnitTest3.TestMethod1", user, TimeSpan.FromSeconds(10));
17 var user2 = Cache<LoginUser>.Get("UnitTest3.TestMethod1");
18
19 Assert.AreEqual(user.Id, user2.Id);
20 }
21 }
看来没有什么问题。
项目架构开发系列
- 项目架构开发:数据访问层之Cache
- 项目架构开发:数据访问层之Logger
- 项目架构开发:数据访问层之Repository
- 项目架构开发:数据访问层之Query
- 项目架构开发:数据访问层之UnitOfWork
项目架构开发:数据访问层之Cache相关推荐
- 企业级应用架构(三)三层架构之数据访问层的改进以及测试DOM的发布
在上一篇我们在宏观概要上对DAL层进行了封装与抽象.我们的目的主要有两个:第一,解除BLL层对DAL层的依赖,这一点我们通过定义接口做到了:第二,使我们的DAL层能够支持一切数据访问技术,如Ado.n ...
- 架构设计-数据访问层简述
在前面简单描述了下服务层,SOA面向服务架构,架构设计-业务逻辑层,以及一些面面向设计原则理解和软件架构设计箴言.这篇博客我们将继续进入我们的下一层:数据访问层.无论你用的是什么开发模式或者是业务模式 ...
- 企业级应用架构(二)三层架构之数据访问层的封装与抽象
在上一篇我们知道,要解除BLL对DAL的依赖,我们就必须抽象出DAL层的接口,同时基于DAL的数据访问技术很多,如EF,ADO.NET,LINQ TO SQL,因此,我们的数据访问层必须对这些技术提供 ...
- 三层架构之数据访问层(DAL)
一. DAL层 1..模板: windows->类库 2.引用: Model configuration 3. 原则:一个实体一个Service类; SqlHelper (配置文件:连接字符串 ...
- ASP.NET3.5 企业级项目开发 -- 第二章 数据访问层(DAL)的开发
为什么80%的码农都做不了架构师?>>> ASP.NET3.5 企业级项目开发 -- 第二章 数据访问层(DAL)的开发 前言:本篇主要讲述数据访问层的开发, ...
- ASP.NET3.5 企业级项目开发 -- 第二章(续) 数据访问层(DAL)的开发解决方案提出...
ASP.NET3.5 企业级项目开发 -- 第二章(续) 数据访问层(DAL)的开发解决方案提出 前言:首先给大家说声"对不起",因为自从打算写这系列的文章以来,得到大家很多的支持 ...
- Java job interview:项目开发小组成员网站数据访问层设计
在前面简单描述了下服务层,SOA面向服务架构,架构设计-业务逻辑层,以及一些面面向设计原则理解和软件架构设计箴言.这篇博客我们将继续进入我们的下一层:数据访问层.无论你用的是什么开发模式或者是业务模式 ...
- java数据访问层实例_java实际项目先写哪一层?java三层架构是什么?
在写java实际项目的时候,我们都是要有思维逻辑的,哪一层先写哪一层后写,这些都要考虑清楚,那么接下来,我们就来给大家讲解一下这方面的内容. 这没有标准,一般是controller-service-d ...
- 三层架构:表示层——业务逻辑层——数据访问层
三层架构:表示层--业务逻辑层--数据访问层 1.什么是三层架构 所谓的三层开发就是将系统的整个业务应用划分为表示层--业务逻辑层--数据访问层,这样有利于系统的开发.维护.部署和扩展. 分层是为了实 ...
最新文章
- outguess秘钥加密--[BJDCTF 2nd]圣火昭昭-y1ng
- Spring cloud(Finchley)微服务框架,sleuth整合zipkin链路追踪失效的问题
- AAAI 2019 Oral | 让TA说你想听的—基于音/视频特征解离的讲述者人脸生成
- 基于HTML5 的人脸识别技术
- hibernate SQLQuery实践指南
- 邮件服务器的功能以及相关工作原理
- 【rmzt】美女之目露凶光win7主题
- 导出 Mac 版微信聊天记录
- 台式机计算机上的无线开关,台式机无线网络开关在哪
- 计算机专业移民,计算机专业成为新晋移民专业了!
- java 发微信视频_分享java微信开发视频
- 【考研英语】阅读理解词汇注释
- Cardinality Estimation
- PDF电子发票内容提取
- typec耳机知识介绍
- 陶哲轩实分析习题8.3.4
- 分析型CRM软件能帮到你什么?
- 利用Qt来进行文件后缀的更改
- 大数据技术之Kylin
- 11-贴片陶瓷电容材质NPO、C0G、X7R、X5R、Y5V、Z5U区别
热门文章
- Linux 普通用户拿到root权限及使用szrz命令上传下载文件
- 用IIS配置反向代理
- DataGridView数据导入到Excel 中
- [转+整理]十道海量数据处理面试题与十个方法大总结
- DP问题之 捞鱼问题
- EDM邮件营销时应该远离的8大不良做法
- 【数据结构与算法】【算法思想】动态规划
- fragment在activity中的静态和动态用法_使用Matlab修改压缩Gif动态图片制作微信表情...
- python打开文件要wordcloud吗,使用python创建wordcloud
- P2678 [NOIP2015 提高组] 跳石头