文章出處

回到目錄

本文來自于實踐中的不足

在最近開始過程中,遇到了一個問題,之前設計的工作單元UoW只支持Insert,Update,Delete三種操作,即開發人員可以將以上三種操作同時扔進工作單元,由工作單元UoW負責事件的處理,這種設計已經出現很多年了,大叔感覺也是不錯,思路就是在工作單元里添加三個字典對象,用來存儲你的Insert,Update,Delete操作,然后在commit時,統一進行提交!

業務中完成的體現

在調試中,集成了select方法,即當添加,更新之后,你把最新數據拿到,并進行下一個業務的操作,這個過程中,拿數據也需要在事務中完成,而之前的設計是不支持這個功能的,可以說是個缺陷,本講主要是解決了這個問題,在業務層,可以使用嵌套的注入來表示,代碼一段如下:

       uow.RegisterChangeded(entity, SqlType.Insert, repository, (newEntity) =>
            {
                var old = repository.GetModel().FirstOrDefault(o => o.ID == entity.ID);
                old.DataCtrlName = "Name|Email";
                uow.RegisterChangeded(old, SqlType.Update, repository);
            });
            uow.Commit();

從上面代碼中,我們看到了,在Insert方法里,有一個GetModel(),然后對實體進行賦值后,又調用了Update,這樣就形成了一個Insert與update的嵌套,這里是使用了工作單元的嵌套.

對UoW的注冊方法的修改

     /// <summary>
        /// 注冊數據變更實體
        /// </summary>
        /// <param name="entity">實體類型</param>
        /// <param name="type">SQL類型</param>
        /// <param name="repository">倉儲</param>
        /// <param name="action">方法回調</param>
        public void RegisterChangeded(
            IEntity entity,
            SqlType type,
            IUnitOfWorkRepository repository,
            Action<IEntity> action = null)
        {

            switch (type)
            {
                case SqlType.Insert:
                    insertEntities.Add(entity, new Tuple<IUnitOfWorkRepository, Action<IEntity>>(repository, action));
                    break;
                case SqlType.Update:
                    updateEntities.Add(entity, new Tuple<IUnitOfWorkRepository, Action<IEntity>>(repository, action));
                    break;
                case SqlType.Delete:
                    deleteEntities.Add(entity, new Tuple<IUnitOfWorkRepository, Action<IEntity>>(repository, action));
                    break;
                default:
                    throw new ArgumentException("you enter reference is error.");
            }
        }

工作單元字典添加委托元素

  private IDictionary<IEntity, Tuple<IUnitOfWorkRepository, Action<IEntity>>> insertEntities;
  private IDictionary<IEntity, Tuple<IUnitOfWorkRepository, Action<IEntity>>> updateEntities;
  private IDictionary<IEntity, Tuple<IUnitOfWorkRepository, Action<IEntity>>> deleteEntities;

下面是程序運行后的截圖,我們可以看到,整個過程是在serializable級別的事務里的,即最高的事務級別!

對于知識的總結與研究很重要,有時,我們對一個事物一定要有較真的精神,我經常這樣對我兒子說,學英語,一定要較真

感謝各位的閱讀!

回到目錄


文章列表




Avast logo

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


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

    IT工程師數位筆記本

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