Lind.DDD.UoW~方法回撥完成原子化操作
阿新 • • 發佈:2018-12-30
本文來自於實踐中的不足
在最近開始過程中,遇到了一個問題,之前設計的工作單元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級別的事務裡的,即最高的事務級別!
對於知識的總結與研究很重要,有時,我們對一個事物一定要有較真的精神,我經常這樣對我兒子說,學英語,一定要較真!
感謝各位的閱讀!