数据访问层简单介绍

数据访问层,提供整个项目的数据访问与持久化功能。在分层系统中所有有关数据访问、检索、持久化的任务,最终都将在这一层完成。

来看一个比较经典的数据访问层结构图

大概可以看出如下信息

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相关推荐

  1. 企业级应用架构(三)三层架构之数据访问层的改进以及测试DOM的发布

    在上一篇我们在宏观概要上对DAL层进行了封装与抽象.我们的目的主要有两个:第一,解除BLL层对DAL层的依赖,这一点我们通过定义接口做到了:第二,使我们的DAL层能够支持一切数据访问技术,如Ado.n ...

  2. 架构设计-数据访问层简述

    在前面简单描述了下服务层,SOA面向服务架构,架构设计-业务逻辑层,以及一些面面向设计原则理解和软件架构设计箴言.这篇博客我们将继续进入我们的下一层:数据访问层.无论你用的是什么开发模式或者是业务模式 ...

  3. 企业级应用架构(二)三层架构之数据访问层的封装与抽象

    在上一篇我们知道,要解除BLL对DAL的依赖,我们就必须抽象出DAL层的接口,同时基于DAL的数据访问技术很多,如EF,ADO.NET,LINQ TO SQL,因此,我们的数据访问层必须对这些技术提供 ...

  4. 三层架构之数据访问层(DAL)

    一. DAL层 1..模板: windows->类库 2.引用: Model  configuration 3. 原则:一个实体一个Service类; SqlHelper (配置文件:连接字符串 ...

  5. ASP.NET3.5 企业级项目开发 -- 第二章 数据访问层(DAL)的开发

    为什么80%的码农都做不了架构师?>>>    ASP.NET3.5 企业级项目开发 -- 第二章 数据访问层(DAL)的开发          前言:本篇主要讲述数据访问层的开发, ...

  6. ASP.NET3.5 企业级项目开发 -- 第二章(续) 数据访问层(DAL)的开发解决方案提出...

    ASP.NET3.5 企业级项目开发 -- 第二章(续) 数据访问层(DAL)的开发解决方案提出 前言:首先给大家说声"对不起",因为自从打算写这系列的文章以来,得到大家很多的支持 ...

  7. Java job interview:项目开发小组成员网站数据访问层设计

    在前面简单描述了下服务层,SOA面向服务架构,架构设计-业务逻辑层,以及一些面面向设计原则理解和软件架构设计箴言.这篇博客我们将继续进入我们的下一层:数据访问层.无论你用的是什么开发模式或者是业务模式 ...

  8. java数据访问层实例_java实际项目先写哪一层?java三层架构是什么?

    在写java实际项目的时候,我们都是要有思维逻辑的,哪一层先写哪一层后写,这些都要考虑清楚,那么接下来,我们就来给大家讲解一下这方面的内容. 这没有标准,一般是controller-service-d ...

  9. 三层架构:表示层——业务逻辑层——数据访问层

    三层架构:表示层--业务逻辑层--数据访问层 1.什么是三层架构 所谓的三层开发就是将系统的整个业务应用划分为表示层--业务逻辑层--数据访问层,这样有利于系统的开发.维护.部署和扩展. 分层是为了实 ...

最新文章

  1. outguess秘钥加密--[BJDCTF 2nd]圣火昭昭-y1ng
  2. Spring cloud(Finchley)微服务框架,sleuth整合zipkin链路追踪失效的问题
  3. AAAI 2019 Oral | 让TA说你想听的—基于音/视频特征解离的讲述者人脸生成
  4. 基于HTML5 的人脸识别技术
  5. hibernate SQLQuery实践指南
  6. 邮件服务器的功能以及相关工作原理
  7. 【rmzt】美女之目露凶光win7主题
  8. 导出 Mac 版微信聊天记录
  9. 台式机计算机上的无线开关,台式机无线网络开关在哪
  10. 计算机专业移民,计算机专业成为新晋移民专业了!
  11. java 发微信视频_分享java微信开发视频
  12. 【考研英语】阅读理解词汇注释
  13. Cardinality Estimation
  14. PDF电子发票内容提取
  15. typec耳机知识介绍
  16. 陶哲轩实分析习题8.3.4
  17. 分析型CRM软件能帮到你什么?
  18. 利用Qt来进行文件后缀的更改
  19. 大数据技术之Kylin
  20. 11-贴片陶瓷电容材质NPO、C0G、X7R、X5R、Y5V、Z5U区别

热门文章

  1. Linux 普通用户拿到root权限及使用szrz命令上传下载文件
  2. 用IIS配置反向代理
  3. DataGridView数据导入到Excel 中
  4. [转+整理]十道海量数据处理面试题与十个方法大总结
  5. DP问题之 捞鱼问题
  6. EDM邮件营销时应该远离的8大不良做法
  7. 【数据结构与算法】【算法思想】动态规划
  8. fragment在activity中的静态和动态用法_使用Matlab修改压缩Gif动态图片制作微信表情...
  9. python打开文件要wordcloud吗,使用python创建wordcloud
  10. P2678 [NOIP2015 提高组] 跳石头