中文字幕精品亚洲无线码二区,国产黄a三级三级三级看三级,亚洲七七久久桃花影院,丰满少妇被猛烈进入,国产小视频在线观看网站

MongoDB學習筆記~為IMongoRepository接口添加了增(zeng)刪改(gai)方法,針對(dui)官(guan)方驅動

回到目錄

上一講說了MongoDB官方驅動的查詢功能,這(zhe)回說一下(xia)官(guan)方驅動的(de)增刪改(gai)(gai)功能,驅動在(zai)升級為2.0后,相應的(de)insert,update和delete都(dou)只(zhi)有了異步(bu)(bu)版(ban)本(或者叫并行(xing)版(ban)本),這(zhe)當然也是跟著.net走(zou)的(de)正(zheng)方向,大(da)事所(suo)趨,但有時(shi),我們的(de)前(qian)臺(tai)(tai)已經(jing)使用(yong)同步(bu)(bu)方式實現(xian)了,為了不(bu)改(gai)(gai)變前(qian)臺(tai)(tai)代(dai)碼(ma),所(suo)以(yi),后臺(tai)(tai)的(de)異步(bu)(bu)版(ban)本可能不(bu)是我們所(suo)需要的(de),所(suo)以(yi),我們需要將(jiang)它進行(xing)一些改(gai)(gai)造(zao),把異步(bu)(bu)改(gai)(gai)為同步(bu)(bu),即主線程等待異步(bu)(bu)方法執行(xing)結束后,再進行(xing)下(xia)面的(de)代(dai)碼(ma),這(zhe)樣,可以(yi)保證方法的(de)正(zheng)確性(xing)。

由(you)于insert,update,delete都(dou)要進行這種等待,所(suo)以,把(ba)它提取(qu)到一個方法中

       /// <summary>
        /// 等待(dai)Task執行完成后再(zai)返回
        /// </summary>
        /// <param name="func"></param>
        /// <returns></returns>
        private Task ForWait(Func<Task> func)
        {
            var t = func();
            t.Wait();
            return t;
        }

下面(mian)是(shi)(shi)對(dui)Insert,update和delete進行了官方驅動(dong)的實(shi)現,方法簽(qian)名沒有(you)對(dui)Mongo進行公開,這對(dui)于開發人員來說是(shi)(shi)個好事,下面(mian)來看一下代(dai)碼

       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)//更新集中不(bu)能有實體鍵_id
                {
                    fieldList.Add(Builders<TEntity>.Update.Set(property.Name, property.GetValue(item)));
                }
            }

            return ForWait(() => _table.UpdateOneAsync(query, Builders<TEntity>.Update.Combine(fieldList)));

        }

相應的(de),同步(bu)(bu)的(de)方法(fa)直接調用異步(bu)(bu)方法(fa)(當前現在它只是個偽(wei)異步(bu)(bu))

       public void Insert(TEntity item)
        {
            InsertAsync(item);
        }

        public void Delete(TEntity item)
        {
            DeleteAsync(item);
        }

        public void Update(TEntity item)
        {
            UpdateAsync(item);
        }

對于業務層在調用它時,與大叔之前(qian)的EF架構,Redis架構沒有任(ren)何區別,所以各位,完全可(ke)以通過IoC將這(zhe)些持久(jiu)化的方法進行動態的切(qie)換(huan)!各自發揮(hui)和(he)自的優勢!

這就(jiu)是:八仙過海(hai),各顯神通!

 回到目錄

posted @ 2015-04-29 22:36  張占嶺  閱讀(6202)  評論(2)    收藏  舉報