项目架构开发:数据访问层之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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/438889.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

jquery mysql实现加入购物车_jQuery实现加入购物车飞入动画效果

HTML首先载入jQuery库文件和jquery.fly.min.js插件。接着&#xff0c;将商品信息html结构布置好&#xff0c;本例中&#xff0c;我们用四个商品并排布置&#xff0c;每个商品box中包括有商品图片、价格、名称以及加入购物车按钮等信息。&#xffe5;3499.00LG 49LF5400-CA 49寸…

angular是MVC模式还是MVVM架构模式

下面仅是个人对angular是MVC或者MVVM的理解。 首先在讨论angular是哪种模式之前&#xff0c;我们得先了解什么是MVVM和MVC。 MVVM vs MVC 总体介绍 首先&#xff0c;两者都是一种架构思想。都是从后端演变而来。 具体的演变流程&#xff1a;传统MVC ——> MVP ——>…

mysql current_MySQL中CURRENT_TIMESTAMP数据类型详解

例1. MySQL 获得当前时间戳函数&#xff1a;current_timestamp, current_timestamp()代码如下mysql> select current_timestamp, current_timestamp();------------------------------------------| current_timestamp | current_timestamp() |----------------------------…

结合vue、react、angular谈谈MVC、MVP、MVVM框架

首先&#xff0c;在谈这个话题之前&#xff0c; 我们有必要了解一下库和框架的区别。 我们先来看react官网以及vue官网对他们的定位&#xff1a; react: vue: react我们不说了&#xff0c;官网上明明白白说了&#xff0c;人家是一个library&#xff0c;用于构建用户界面。 v…

mysql emma_ubuntu mysql emma中文乱码问题解决

ubuntu mysql emma中文乱码问题解决emma默认用apt-get 安装的话&#xff0c;emma是不支持中文的&#xff0c;配置文件或直接修改emma程序源文件(python)。apt-get安装emmasudo apt-get install emmaubuntu的apt-get 安装emma是在/usr/share/emma目录下面。cd /usr/share/emma/e…

Vue(MVVM)、React(MVVM)、Angular(MVC)对比

前言 昨天阿里内推电面一面&#xff0c;面试官了解到项目中用过Vue&#xff0c;就问为什么前端框架使用Vue而不适用其他的框架&#xff0c;当时就懵了。因为只用过Vue&#xff0c;不了解其他两个框架&#xff0c;今天就赶紧去了解一下他们之间的区别。大家发现如果本文中哪个地…

.NET的MVVM框架

Model-View-ViewModel 是一种架构模式&#xff0c;主要在 WPF、Silverlight 和 WP7 开发里使用&#xff0c;它的目标是从视图层移除几乎所有代码隐藏&#xff08;code-behind&#xff09;。交互设计师可以专注于使用 XAML 表达用户体验需求&#xff0c;然后创建和视图模型的绑定…

mysql 索引 lt =_MySQL索引相关

MySQL索引采用的是BTREE&#xff0c;多列联合索引是一个有序元组&#xff0c;其中各个元素均为数据表的一列。设一个表有M列&#xff0c;建一个度为n的多列联合索引&#xff0c;深度h lognM&#xff0c;设一组索引列的大小为s&#xff0c;索引文件的大小可以计算为s*M*(1M/nM/…

.NET平台下开源框架

一、AOP框架 Encase 是C#编写开发的为.NET平台提供的AOP框架。Encase 独特的提供了把方面(aspects)部署到运行时代码&#xff0c;而其它AOP框架依赖配置文件的方式。这种部署方面(aspects)的方法帮助缺少经验的开发人员提高开发效率。 NKalore是一款编程语言&#xff0c;它扩展…

mysql存储过程查询所有表_mysql存储过程利用游标查询每个数据库的所有表

DELIMITER $DROP PROCEDURE listAllDB;CREATE PROCEDURE listAllDB()BEGINDECLARE no_more_record INT DEFAULT 0;/*定义2个变量&#xff1a;temp用于记录游标每次next的值&#xff0c;schemaName表示将所有temp拼接后的值*/DECLARE schemaName varchar(500) DEFAULT ;DECLARE …

先进的ASP.NET开源工作流快速开发框架 - RoadFlow

.net可视化工作流引擎RoadFlow - 设计概述 RoadFlow是天知软件旗下基于.NET的工作流快速开发平台&#xff0c;由从事六年以上OA及工作流开发与实施的团队设计开发&#xff0c;该工作流平台已应用于众多大型企事业单位。拥有全浏览器兼容的可视化流程设计器、表单设计器、基于角…

view [bootstrap-4] not found如何解决_Dubbo如何处理业务异常,这个一定要知道哦

前言我们在开发应用系统时&#xff0c;不可避免的要使用到我们自己定义的异常&#xff0c;所以我们一般通常会用到自定义的业务异常类BusinessException&#xff0c;这个异常会继承extends RuntimeException&#xff0c;当发生业务限制的时候&#xff0c;会throw出来。问题在Sp…

c# 自定义应用程序配置文件(app.config)

1. 向项目添加app.config文件&#xff1a; 右击项目名称&#xff0c;选择“添加”→“添加新建项”&#xff0c;在出现的“添加新项”对话框中&#xff0c;选择“添加应用程序配置文件”&#xff1b;如果项目以前没有配置文件&#xff0c;则默认的文件名称为“app.config”&…

python爬取文件归类_python爬取各类文档方法归类汇总

HTML文档是互联网上的主要文档类型&#xff0c;但还存在如TXT、WORD、excel、PDF、csv等多种类型的文档。网络爬虫不仅需要能够抓取HTML中的敏感信息&#xff0c;也需要有抓取其他类型文档的能力。下面简要记录一些个人已知的基于python3的抓取方法&#xff0c;以备查阅。1.抓取…

.NET(C#)有哪些主流的ORM框架

前言 在以前的一篇文章中&#xff0c;为大家分享了《什么是ORM&#xff1f;为什么用ORM&#xff1f;浅析ORM的使用及利弊》。那么&#xff0c;在目前的.NET(C#)的世界里&#xff0c;有哪些主流的ORM&#xff0c;SqlSugar&#xff0c;Dapper&#xff0c;Entity Framework(EF)还…

android 加载网络bitmap图片 oom 简书_Android常见问题--ImageView加载图片OOM

开发中给ImageView加载一个高质量图片时&#xff0c;APP抛出了“Canvas: trying to draw too large(840253440bytes) bitmap.”的异常。猜测是图片占用内存太大&#xff0c;超出APP被分配的内存(我用的mate9&#xff0c;APP被分的内存差不多200m)&#xff0c;造成了OOM。解决方…

.net开源框架开源类库(整理)

常用库 Json.NET https://github.com/JamesNK/Newtonsoft.Json Json.Net 是一个读写Json效率比较高的.Net框架.Json.Net 使得在.Net环境下使用Json更加简单。通过Linq To JSON可以快速的读写Json&#xff0c;通过JsonSerializer可以序列化你的.Net对象。让你轻松实现.Net中…

docker jdk mysql_docker部署springboot前后端分离项目(jdk+jar包+mysql+redis+nginx)(示例代码)...

jdk1.8&#xff0c;dockerfile文件1.vim jdk-dockerfile?FROM centos:7MAINTAINER sinvie.cnWORKDIR /usrRUN mkdir /usr/local/javaADD jdk-8u221-linux-x64.tar.gz /usr/local/java/ENV JAVA_HOME /usr/local/java/jdk1.8.0_221ENV JRE_HOME $JAVA_HOME/jreENV CLASSPATH $J…

matlab连接mysql教程视频_Matlab建立到Oracle数据库的连接

Linux下的配置过程和Windows一样&#xff0c;如下&#xff1a;1、将Oracle JDBC的JAR包拷贝到Matlab的相关目录(..\matlab\java\jar\toolbox\)下。一、Matlab通过ODBC建立到Oracle数据库的连接1、在Windows下“开始”→“控制面板”→“性能和维护”→“管理工具”&#xff0c;…

C# App.config学习

进入公司一年多来&#xff0c;对配置文件添加了不少参数&#xff0c;但是从未想过这些参数是如何被读取出来的&#xff0c;今天把读取参数的处理看了一下&#xff0c;收获不少。假定有App.config如下 <?xml version"1.0" encoding"utf-8" ?> <…