博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Redis学习笔记~是时候为Redis实现一个仓储了,RedisRepository来了
阅读量:6258 次
发布时间:2019-06-22

本文共 3315 字,大约阅读时间需要 11 分钟。

之前写了不少关于仓储的文章,所以,自己习惯把自己叫仓储大叔,,也有不少朋友给我发email,进行一些知识的探讨,今天主要来实现一个RedisRepository,它始终是集成IRepository接口的,我这里的Redis仓储主要服务为复杂类型的业务,对于只存string这种需求,不需要使用它。

对于Redis仓储和说,它与XML仓储有些不同,由于XML文件一般存储在WWW服务器,所以没有网络通讯问题,而redis一般部署在第三台服务器上,我们一般称为NoSQL服务器,它与WWW通讯是通过socket协议完成的,正是如些,我们在进行仓储设计时,应该考虑到如何去释放它的资源,因为这种资源是非托管的,所以需要人为干预一下,.net提供了using关键字来做这事,而每个动作写using这显然是不友好的,所以,我这个redis仓储是在析构方法里完成对资源的销毁的,请看源代码:

首先是redis基类,它是实现统一操作的前提

  ///     /// Redis实体基类,所有redis实体类都应该集成它    ///     public abstract class RedisEntity    {        public RedisEntity()        {            RootID = Guid.NewGuid().ToString();        }        ///         /// Redis实体主键,方法查询,删除,更新等操作        ///         public virtual string RootID { get; set; }    }

下面才是RedisRepository仓储的代码

///     /// Redis仓储实现    ///     public class RedisRepository
: IDisposable, IRepository
where TEntity : RedisEntity { IRedisClient redisDB; IRedisTypedClient
redisTypedClient; IRedisList
table; public RedisRepository() { redisDB = RedisManager.GetClient(); redisTypedClient = redisDB.GetTypedClient
(); table = redisTypedClient.Lists[typeof(TEntity).Name]; } #region IRepository
成员 public void SetDbContext(IUnitOfWork unitOfWork) { throw new NotImplementedException(); } public void Insert(TEntity item) { if (item != null) { redisTypedClient.AddItemToList(table, item);   redisDB.Save(); } } public void Delete(TEntity item) {   if (item != null)             {                 var entity = Find(item.RootID);                 redisTypedClient.RemoveItemFromList(table, entity);                 redisDB.Save();             } } public void Update(TEntity item) { if (item != null) { var old = Find(item.RootID); if (old != null) { redisTypedClient.RemoveItemFromList(table, old); redisTypedClient.AddItemToList(table, item); redisDB.Save(); } } } public IQueryable
GetModel() { return table.GetAll().AsQueryable(); } public TEntity Find(params object[] id) { return table.Where(i => i.RootID == (string)id[0]).FirstOrDefault(); } #endregion #region IDisposable成员 public void Dispose() { this.ExplicitDispose(); } #endregion #region Protected Methods ///
/// Provides the facility that disposes the object in an explicit manner, /// preventing the Finalizer from being called after the object has been /// disposed explicitly. /// protected void ExplicitDispose() { this.Dispose(true); GC.SuppressFinalize(this); } protected void Dispose(bool disposing) { if (disposing)//清除非托管资源 { table = null; redisTypedClient = null; redisDB.Dispose(); } } #endregion #region Finalization Constructs ///
/// Finalizes the object. /// ~RedisRepository() { this.Dispose(false); } #endregion }}

下面是在控制台中进行仓储的调用

      IRepository
repository = new Redis.Data.Core.RedisRepository
(); repository.Insert(new Car { ID = 3, Name = "占" }); var entity = repository.GetModel().Where(i => i.ID == 3).FirstOrDefault(); entity.Name = "修改了"; repository.Update(entity); repository.GetModel().ToList().ForEach(e => { Console.WriteLine(e.ID + "/" + e.RootID + "/" + e.Name); });

下面是实现的结果的截图

本文转自博客园张占岭(仓储大叔)的博客,原文链接:,如需转载请自行联系原博主。

你可能感兴趣的文章
增强for循环的使用详解及代码
查看>>
程序员优化程序流程
查看>>
6 ZigZag Conversion
查看>>
[react-router] 平时积累
查看>>
强类型数据集
查看>>
使用python处理selenium中的获取文本问题
查看>>
LinearLayout布局
查看>>
java 的 (PO,VO,TO,BO,DAO,POJO) 解释
查看>>
基本计数方法
查看>>
Mock.js:前后端分离开发工具
查看>>
内容循环滚动的表格
查看>>
Catalyst揭秘 Day7 SQL转为RDD的具体实现
查看>>
【转载】小公司如何管理
查看>>
DOM笔记(十):JavaScript正则表达式
查看>>
关于贴友的一个书本页面简单布局(html+css)的实现
查看>>
input 内容发生改变时触发事件
查看>>
IOS之表视图单元格删除、移动及插入
查看>>
转载翻译简介:关于Flash and C++ Native Extension C++扩展ANE——2
查看>>
【Android】10.4 卡片视图
查看>>
虚化技术的额外开销
查看>>