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

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

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

先进的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…

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。解决方…

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" ?> <…

大数据-----软件开发模型(详细讲解)

大数据学习免费学习资料&#xff08;免费教程&#xff09; 软件工程中&#xff0c;常用的开了模型有四种&#xff1a;瀑布模型、原型模型、增量模型和螺旋模型。 ⒈瀑布模型包括计划&#xff0c;需求分析、设计、编码、测试、运行维护六个阶段&#xff0c;阶段自上而下&#x…

C#中struct和class的区别详解

本文详细分析了C#中struct和class的区别&#xff0c;对于C#初学者来说是有必要加以了解并掌握的。 简单来说&#xff0c;struct是值类型&#xff0c;创建一个struct类型的实例被分配在栈上。class是引用类型&#xff0c;创建一个class类型实例被分配在托管堆上。但struct和cla…

ssm框架搭建连接mysql_从零开始搭建SSM框架(Spring + Spring MVC + Mybatis)

最近在回顾和总结一些技术&#xff0c;想到了把之前比较火的 SSM 框架重新搭建出来&#xff0c;作为一个小结&#xff0c;同时也希望本文章写出来能对大家有一些帮助和启发&#xff0c;因本人水平有限&#xff0c;难免可能会有一些不对之处&#xff0c;欢迎各位大神拍砖指教&am…

基于TFS实践敏捷-可视化管理

TFS是基于微软平台一套不错的系统&#xff0c;支持源码管理运行调试持续集成自动化测试Bug管理代码评审任务项管理文档管理沟通管理。 基于TFS 2015实践看板管理&#xff0c;让团队的数据可视化&#xff0c;让大家更多的关心产品、关注团队的努力&#xff0c;增强沟通、及时反映…

[转载]基于TFS实践敏捷-修复Bug和执行代码评审

本主题阐释了这些功能&#xff0c;以继续这一关注虚拟敏捷团队成员的一天的教程。 Peter 忙于编写一些代码以完成积压工作 (backlog) 项任务。但是&#xff0c;他的同事发现了一个阻碍他们工作的 Bug&#xff0c;他想立即修复此 Bug。 他暂停了手中的工作并修复此 Bug。 他请求…

单元测试入门

https://docs.microsoft.com/zh-cn/visualstudio/test/getting-started-with-unit-testing?viewvs-2019 使用 Visual Studio 定义和运行单元测试&#xff0c;使代码保持正常运行、确保代码覆盖率并在客户之前找到错误和缺陷。 经常运行单元测试&#xff0c;确保代码正常运行。…

.net开源框架简介和通用技术选型建议

.net体系 .net core .net 类库 asp.net mvc asp.net webapi asp.net core EF 跨平台和运行时解决方案&#xff08;解决方案&#xff09; Katana&#xff1a;微软基于OWIN规范实现的非IIS寄宿ASP.NET和MVC等。 MONO.NET&#xff1a;跨平台的.NET运行环境&#xff0c;让.NE…

JAVA 2048源码_java实现2048游戏源代码

本文实例为大家分享了java实现2048游戏源代码&#xff0c;供大家参考&#xff0c;具体内容如下一.主要功能&#xff1a;1、游戏初始化&#xff1a;新建游戏44的16宫格画布&#xff0c;随机格子上生成2或者4两个数字2、格子的移动&#xff1a;先判断能否移动&#xff0c;移动后判…

开源干货!.NET Core + Vue.js通用动态权限(RBAC)管理系统框架[DncZeus]开源

DncZeus 前言 关于 DncZeus DncZeus Dnc Zeus "Dnc"--.Net Core 的缩写&#xff1b; "Zeus"--中文译为宙斯&#xff0c;是古希腊神话中的众神之王&#xff0c;奥林匹斯十二主神之首&#xff0c;统治宇宙万物的至高无上的主神&#xff08;在古希腊神…

十大开源的.NET用户界面框架 让GUI设计不再犯难

选择一款合适的GUI框架是.NET开发中比较重要但又很棘手的问题&#xff0c;因为用户界面相当于一款应用的"门面"&#xff0c;直接面向用户。好的UI更能吸引用户&#xff0c;有时甚至成为决定一款应用成败的关键。下面小编整理出十大应用最广泛.NET开源用户界面框架&am…

python flv转mp4_ffmpeg将多个flv文件合成为mp4(python版)

需求直播生成的flv片段需要做个归档&#xff0c;把指定的文件夹中的flv合并成一个mp4&#xff0c;简单的转码合并操作直接用命令行调用来实现。注意事项flv文件直接合并生成mp4的话只有第一个flv的内容才能播放&#xff0c;需要先转换成ts再合成mp4使用的第三方库ffmpy&#xf…

多租户技术

本词条由“科普中国”科学百科词条编写与应用工作项目 审核 。 多租户技术&#xff08;英语&#xff1a;multi-tenancy technology&#xff09;或称多重租赁技术&#xff0c;是一种软件架构技术&#xff0c;它是在探讨与实现如何于多用户的环境下共用相同的系统或程序组件&…

使用开源工具ELK可视化 Azure NSG日志

国内的Azure最近上线了网络观察程序服务&#xff0c;可以帮助用户监控和分析VNET虚拟网络。其中一个很重要的功能就是可以记录NSG的安全访问日志了。但是如果用户设置了NSG流日志&#xff0c;并下载日志想要分析一下的话&#xff0c;会发现日志其实并不是很友好&#xff0c;NSG…