1. 程式人生 > >MongoDB學習筆記~為IMongoRepository介面添加了增刪改方法,針對官方驅動

MongoDB學習筆記~為IMongoRepository介面添加了增刪改方法,針對官方驅動

回到目錄

上一講說了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將這些持久化的方法進行動態的切換!各自發揮和自的優勢!

這就是:八仙過海,各顯神通!

 回到目錄