文章出處

回到目錄

返回異步與并行目錄

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聲明的實例,就是以異步的方式實現操作。

回到目錄

返回異步與并行目錄


文章列表




Avast logo

Avast 防毒軟體已檢查此封電子郵件的病毒。
www.avast.com


全站熱搜
創作者介紹
創作者 大師兄 的頭像
大師兄

IT工程師數位筆記本

大師兄 發表在 痞客邦 留言(0) 人氣()