MongoDB学习笔记~为IMongoRepository接口添加了增删改方法,针对官方驱动
2015-04-29 22:36
459 查看
回到目录
上一讲说了MongoDB官方驱动的查询功能,这回说一下官方驱动的增删改功能,驱动在升级为2.0后,相应的insert,update和delete都只有了异步版本(或者叫并行版本),这当然也是跟着.net走的正方向,大事所趋,但有时,我们的前台已经使用同步方式实现了,为了不改变前台代码,所以,后台的异步版本可能不是我们所需要的,所以,我们需要将它进行一些改造,把异步改为同步,即主线程等待异步方法执行结束后,再进行下面的代码,这样,可以保证方法的正确性。
由于insert,update,delete都要进行这种等待,所以,把它提取到一个方法中
下面是对Insert,update和delete进行了官方驱动的实现,方法签名没有对Mongo进行公开,这对于开发人员来说是个好事,下面来看一下代码
相应的,同步的方法直接调用异步方法(当前现在它只是个伪异步)
对于业务层在调用它时,与大叔之前的EF架构,Redis架构没有任何区别,所以各位,完全可以通过IoC将这些持久化的方法进行动态的切换!各自发挥和自的优势!
这就是:八仙过海,各显神通!
回到目录
上一讲说了MongoDB官方驱动的查询功能,这回说一下官方驱动的增删改功能,驱动在升级为2.0后,相应的insert,update和delete都只有了异步版本(或者叫并行版本),这当然也是跟着.net走的正方向,大事所趋,但有时,我们的前台已经使用同步方式实现了,为了不改变前台代码,所以,后台的异步版本可能不是我们所需要的,所以,我们需要将它进行一些改造,把异步改为同步,即主线程等待异步方法执行结束后,再进行下面的代码,这样,可以保证方法的正确性。
由于insert,update,delete都要进行这种等待,所以,把它提取到一个方法中
/// <summary> /// 等待Task执行完成后再返回 /// </summary> /// <param name="func"></param> /// <returns></returns> private Task ForWait(Func<Task> func) { var t = func(); t.Wait(); return t; }
下面是对Insert,update和delete进行了官方驱动的实现,方法签名没有对Mongo进行公开,这对于开发人员来说是个好事,下面来看一下代码
public Task InsertAsync(TEntity item) { return ForWait(() => _table.InsertOneAsync(item)); } public Task DeleteAsync(TEntity item) { var query = new QueryDocument("_id", new ObjectId(typeof(TEntity).GetProperty(EntityKey).GetValue(item).ToString())); return ForWait(() => _table.DeleteOneAsync(query)); } public Task UpdateAsync(TEntity item) { var query = new QueryDocument("_id", new ObjectId(typeof(TEntity).GetProperty(EntityKey).GetValue(item).ToString())); var fieldList = new List<UpdateDefinition<TEntity>>(); foreach (var property in typeof(TEntity).GetProperties(BindingFlags.Instance | BindingFlags.Public)) { if (property.Name != EntityKey)//更新集中不能有实体键_id { fieldList.Add(Builders<TEntity>.Update.Set(property.Name, property.GetValue(item))); } } return ForWait(() => _table.UpdateOneAsync(query, Builders<TEntity>.Update.Combine(fieldList))); }
相应的,同步的方法直接调用异步方法(当前现在它只是个伪异步)
public void Insert(TEntity item) { InsertAsync(item); } public void Delete(TEntity item) { DeleteAsync(item); } public void Update(TEntity item) { UpdateAsync(item); }
对于业务层在调用它时,与大叔之前的EF架构,Redis架构没有任何区别,所以各位,完全可以通过IoC将这些持久化的方法进行动态的切换!各自发挥和自的优势!
这就是:八仙过海,各显神通!
回到目录
相关文章推荐
- MongoDB学习笔记~为IMongoRepository接口添加分页取集合的方法
- MongoDB学习笔记~为IMongoRepository接口更新指定字段
- MongoDB:利用官方驱动改装为EF代码风格的MongoDB.Repository框架 五 --- 为List<MongoDBRef>增加扩展方法
- MT6573添加新硬件模块驱动方法
- Linux 音频 驱动 接口 简介 之 OSS 编程 方法 采样频率 量化 位数 实例 driver interface
- Go 之旅四: 方法与接口篇
- N7系统VC6中添加OCX出现“不支持此接口” 问题的解决方法
- Android中添加监听回调接口的方法
- 【转帖】扩展微软DDK中的NDIS IM驱动的功能:添加一个DeviceIoControl接口
- 针对近期的驱动病毒usb8028,usb8028x,以及一个随机的保护驱动的解决方法
- Win7官方打印驱动安装不上的一种解决方法
- Go 方法、接口
- Spring Data JPA: 为单个Repository添加自定义方法
- 在VLC控件中添加接口的方法
- ATI或Nvidia显卡最新官方驱动安装方法
- SPI接口的FLASH ROM AT45DB161D的驱动方法
- 针对近期的驱动病毒usb8028,usb8028x,以及一个随机的保护驱动的解决方法
- ubuntu安装NVIDIA显卡官方驱动方法
- WIN7系统VC6中添加OCX出现“不支持此接口” 问题的解决方法