Asp.Net Core 工作單元示例 來自 ABP UOW 去除所有無用特性
?
?
代碼下載 :
去除所有無用特性版本,原生AspNetCore實現 差不多 2278 行代碼:
? ? 鏈接:https://pan.baidu.com/s/1NoEIDSAPNr46xNHYEx9KCA
? ? 提取碼:570i
包含Castle.Windsor.MsDependencyInjection + 方法攔截器(Interceptor) 代理版本(Proxy)
? ? 鏈接:https://pan.baidu.com/s/1iL7PHofu3n0IKo_N5BEJhw
? ? 提取碼:i1m7
?
1. 什么叫工作單元?
?
跨多個請求的業務,統一管理事務,統一提交。
?
2. 為什么要工作單元?
?我們經常的代碼都是分層的,有可能到處都在 new DbContext(options),這是就要面對如何管理這些DbContext,在AspNetCore中 services.AddDbContext<>默認是用的Scope的作用域,也就是每次HttpRequest,比以前好了很多。但是事務這些管理還是很麻煩。
?
?如上圖 有一個Action需要調用很多Service 然后 Service之間又相互調用,在開啟Action時 其實是想開啟一個事務,但是某些內部代碼有可能自己去開啟了事務。相互之間調用管理起來非常麻煩。經常出現不可估計的問題。如果有一個集中管理的地方就好很多。比如在Action這里啟動一個工作單元,后續所有的業務都使用同一個事務 和 DbContext,這才是我們的預期的。
?
3. 如何使用工作單元?
http://www.aspnetboilerplate.com/Pages/Documents/Unit-Of-Work
?
//[UnitOfWork(IsDisabled = true)]//添加工作單元配置public async Task<IActionResult> GetSystemInitSettings(){var defaultUsers = _dbContext.Users.Take(5).ToList();//以前的方式 注冊的DbContext//測試1 獲取DbContextvar dbContext = _dbContextProvider.GetDbContext();//IsolationLevel.ReadUncommitted//獲取數據測試var users = dbContext.Users.Take(5).ToList();var importDataTask = ImportDataTask.CreateTask("test1", "1", "userName", Entities.Enum.ImportDataType.無效導入, "", "", 0, "", "");dbContext.ImportDataTasks.Add(importDataTask);//1.如果調用當前_unitOfWorkManager.Current.SaveChanges();//可以保存到數據庫,但是如果UOW不提交則會因為事務回滾,這種情況可以先獲取到數據的ID//** 因為是 事務提交 但是后面還有業務 數據庫查詢會Loading//測試環境2using (var uow2 = _unitOfWorkManager.Begin(TransactionScopeOption.RequiresNew))//要求開啟一個新的工作單元 {var newDbContext = _dbContextProvider.GetDbContext();var importDataTask2 = ImportDataTask.CreateTask("test2", "2", "userName", Entities.Enum.ImportDataType.無效導入, "", "", 0, "", "");newDbContext.ImportDataTasks.Add(importDataTask2);using (var uow3 = _unitOfWorkManager.Begin(new UnitOfWorkOptions{Scope = TransactionScopeOption.Required}))//要求開啟一個新的工作單元 Required 這里不會開啟一個新的UOW {var innerDbContext = _dbContextProvider.GetDbContext();if(innerDbContext == newDbContext){;//相同DbContext }}uow2.Complete();//直接優先提交到數據庫 }await Task.CompletedTask;// throw new Exception();//異常 默認UOW 會回滾 如果不異常保存到數據庫,或者異常被捕獲
?
4. 項目結構和依賴項?
?