MongoDB学习笔记~为IMongoRepository接口添加了增删改方法,针对官方驱动

本文详细介绍了如何将MongoDB官方驱动的异步操作转换为同步操作,包括Insert, Update, Delete等常见操作。通过提取通用方法`TaskForWait`,简化了异步与同步之间的切换,使得开发人员可以根据需要灵活选择操作方式,增强了代码的可维护性和复用性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

回到目录

上一讲说了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将这些持久化的方法进行动态的切换!各自发挥和自的优势!

这就是:八仙过海,各显神通!

 回到目录

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值