Lind.DDD.UoW~方法回調完成原子化操作
本文來自于實踐中的不足
在(zai)最近(jin)開始過程中,遇到(dao)了一個(ge)(ge)問題,之前設(she)計的工(gong)作(zuo)(zuo)單元UoW只支持Insert,Update,Delete三(san)(san)種(zhong)(zhong)操作(zuo)(zuo),即開發人員可(ke)以將(jiang)以上(shang)三(san)(san)種(zhong)(zhong)操作(zuo)(zuo)同時(shi)扔進工(gong)作(zuo)(zuo)單元,由工(gong)作(zuo)(zuo)單元UoW負責事件的處理,這種(zhong)(zhong)設(she)計已(yi)經出現很多年了,大叔(shu)感覺也是不(bu)錯,思路就是在(zai)工(gong)作(zuo)(zuo)單元里添加三(san)(san)個(ge)(ge)字(zi)典對(dui)象,用來存儲(chu)你的Insert,Update,Delete操作(zuo)(zuo),然(ran)后在(zai)commit時(shi),統一進行(xing)提交!
業務中完成的體現
在調試中,集成了select方法,即當添加,更新之后,你把最新數據拿到,并進行下一個業務的操作,這個過程中,拿數據也(ye)需要在(zai)(zai)事(shi)務中完成,而之前的(de)設計是(shi)不支持這(zhe)個功能(neng)的(de),可以說是(shi)個缺陷(xian),本講(jiang)主要是(shi)解決了這(zhe)個問題(ti),在(zai)(zai)業務層(ceng),可以使用(yong)嵌套的(de)注(zhu)入(ru)來表示,代碼一段如下:
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的嵌套,這里是使用了工(gong)作單元的嵌套.
對UoW的注冊方法的修改
/// <summary> /// 注冊數據(ju)變更實體 /// </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級(ji)別(bie)的事(shi)務里的,即最高的事(shi)務級(ji)別(bie)!
對于知識的總結與研究很重要,有時,我們對一個事物一定要有較真的精神,我經常這樣對我兒子說,學英語,一定要較真!
感謝各位的閱讀!