回到目錄
上一講說了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将這些持久化的方法進行動态的切換!各自發揮和自的優勢!
這就是:八仙過海,各顯神通!
回到目錄
作者:倉儲大叔,張占嶺,
榮譽:微軟MVP
QQ:853066980
支付寶掃一掃,為大叔打賞!
