C#5.0帶來了並行程式設計
{C#1.0託管程式碼→C#2.0泛型→C#3.0LINQ→C#4.0動態語言→C#5.0非同步程式設計}
隨著C#5.0在.net4.5出來之後,它們主推的並行技術也逐漸變得越來越熱,這種熱量已經傳到了我這裡,身為倉儲大叔的我,一定也對自己的倉儲進行並行化的改造,這是大勢所趨,呵呵,今天主要是把我的IRepository.Core專案進行擴充套件,即新增一些對應的並行介面,然後讓我的並行(非同步)倉儲去實現它,事實上,.net的ef這塊,實現非同步(並行)非常容易,在C#5.0裡由於async/await關鍵字的出現,這使得實現非同步變得更加容易了,呵呵,還是那句話,身為.net領域的程式編寫者,我感到萬心幸福!
IRepository變成了IRepositoryAsync
/// <summary> /// 非同步操作 /// 基礎的資料操作規範 /// 與ORM架構無關 /// </summary> /// <typeparam name="TEntity"></typeparam> public interface IRepositoryAsync<TEntity> where TEntity : class { /// <summary> /// 設定資料上下文,它一般由構架方法注入 /// </summary> /// <param name="unitOfWork"></param> void SetDbContext(IUnitOfWork unitOfWork); /// <summary> /// 新增實體並提交到資料伺服器 /// </summary> /// <param name="item">Item to add to repository</param> Task Insert(TEntity item); /// <summary> /// 移除實體並提交到資料伺服器 /// 如果表存在約束,需要先刪除子表資訊 /// </summary> /// <param name="item">Item to delete</param> Task Delete(TEntity item); /// <summary> /// 修改實體並提交到資料伺服器 /// </summary> /// <param name="item"></param> Task Update(TEntity item); /// <summary> /// 得到指定的實體集合(延時結果集) /// Get all elements of type {T} in repository /// </summary> /// <returns>List of selected elements</returns> IQueryable<TEntity> GetModel(); /// <summary> /// 根據主鍵得到實體 /// </summary> /// <param name="id"></param> /// <returns></returns> TEntity Find(params object[] id); }
IExtensionRepository變成了IExtensionRepositoryAsync
/// <summary> /// 非同步操作 /// 擴充套件的Repository操作規範 /// </summary> public interface IExtensionRepositoryAsync<TEntity> : IRepositoryAsync<TEntity>, IOrderableRepository<TEntity> where TEntity : class { /// <summary> /// 新增集合[集合數目不大時用此方法,超大集合使用BulkInsert] /// </summary> /// <param name="item"></param> Task Insert(IEnumerable<TEntity> item); /// <summary> /// 修改集合[集合數目不大時用此方法,超大集合使用BulkUpdate] /// </summary> /// <param name="item"></param> Task Update(IEnumerable<TEntity> item); /// <summary> /// 刪除集合[集合數目不大時用此方法,超大集合使用批量刪除] /// </summary> /// <param name="item"></param> Task Delete(IEnumerable<TEntity> item); /// <summary> /// 根據指定lambda表示式,得到延時結果集 /// </summary> /// <param name="predicate"></param> /// <returns></returns> IQueryable<TEntity> GetModel(Expression<Func<TEntity, bool>> predicate); /// <summary> /// 根據指定lambda表示式,得到第一個實體 /// </summary> /// <param name="predicate"></param> /// <returns></returns> TEntity Find(Expression<Func<TEntity, bool>> predicate); /// <summary> /// 批量新增,新增之前可以去除自增屬性,預設不去除 /// </summary> /// <param name="item"></param> /// <param name="isRemoveIdentity"></param> Task BulkInsert(IEnumerable<TEntity> item, bool isRemoveIdentity); /// <summary> /// 批量新增 /// </summary> /// <param name="item"></param> Task BulkInsert(IEnumerable<TEntity> item); /// <summary> /// 批量更新 /// </summary> /// <param name="item"></param> Task BulkUpdate(IEnumerable<TEntity> item, params string[] fieldParams); /// <summary> /// 批量刪除 /// </summary> /// <param name="item"></param> Task BulkDelete(IEnumerable<TEntity> item); /// <summary> /// 儲存之後 /// </summary> event Action<SavedEventArgs> AfterSaved; /// <summary> /// 儲存之前 /// </summary> event Action<SavedEventArgs> BeforeSaved; }
ISpecificationRepository變成了ISpecificationRepositoryAsync
/// <summary> /// EF底層構架,關於規約功能的倉儲介面 /// </summary> /// <typeparam name="TEntity"></typeparam> public interface ISpecificationRepositoryAsync<TEntity> : IExtensionRepositoryAsync<TEntity> where TEntity : class { /// <summary> /// 根據指定規約,得到延時結果集 /// </summary> /// <param name="specification"></param> /// <returns></returns> IQueryable<TEntity> GetModel(ISpecification<TEntity> specification); /// <summary> /// 根據指定規約,得到第一個實體 /// </summary> /// <param name="specification"></param> /// <returns></returns> TEntity Find(ISpecification<TEntity> specification); /// <summary> /// 帶排序功能的,根據指定規約,得到結果集 /// </summary> /// <param name="orderBy"></param> /// <param name="specification"></param> /// <returns></returns> IQueryable<TEntity> GetModel(Action<IOrderable<TEntity>> orderBy, ISpecification<TEntity> specification); }
大家可以看到,倉儲大叔的非同步操作介面都是以Async結尾的,這也是遵從了微軟的規範的,例如同步的ToList()方法在改成非同步後變成了ToListAsync(),而佔佔並沒有在原有介面上進行修改,而是擴充套件了非同步介面,方法名稱並沒有變,感覺這樣對程式開發者
來說更友好,更能接受,即我們的CUD操作還是(Insert,Update,Delete),只是在介面上進行區分,你用IRepository介面來宣告例項,生成的就是同步操作,而使用IRepositoryAsync宣告的例項,就是以非同步的方式實現操作。