From ef5b628b31c3612dd184e309cf11d0b5f4b5696b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=A9=99=E5=AD=90?= <454313500@qq.com> Date: Sat, 15 Apr 2023 12:25:47 +0800 Subject: [PATCH] =?UTF-8?q?feat:=E5=AE=8C=E6=88=90=E5=86=85=E9=83=A8?= =?UTF-8?q?=E6=A0=B8=E5=BF=83=E6=A8=A1=E5=9D=97=E6=9B=BF=E6=8D=A2=E6=94=B9?= =?UTF-8?q?=E9=80=A0=E6=88=90furion?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Sqlsugar/Uow/SqlsugarUnitOfWork.cs | 82 ++++++++++++------- .../Sqlsugar/Uow/SqlsugarUnitOfWorkManager.cs | 38 --------- .../Yi.Framework.Infrastructure/Startup.cs | 3 + .../Uow/DefaultUnitOfWork.cs | 26 ------ .../Uow/DefaultUnitOfWorkManager.cs | 10 --- .../Uow/IUnitOfWork.cs | 14 ---- .../Uow/IUnitOfWorkManager.cs | 8 -- .../System/Services/Impl/AccountService.cs | 9 +- .../System/Services/Impl/RoleService.cs | 3 +- .../System/Services/Impl/UserService.cs | 3 +- 10 files changed, 60 insertions(+), 136 deletions(-) delete mode 100644 Yi.Furion.Rbac/Yi.Framework.Infrastructure/Sqlsugar/Uow/SqlsugarUnitOfWorkManager.cs delete mode 100644 Yi.Furion.Rbac/Yi.Framework.Infrastructure/Uow/DefaultUnitOfWork.cs delete mode 100644 Yi.Furion.Rbac/Yi.Framework.Infrastructure/Uow/DefaultUnitOfWorkManager.cs delete mode 100644 Yi.Furion.Rbac/Yi.Framework.Infrastructure/Uow/IUnitOfWork.cs delete mode 100644 Yi.Furion.Rbac/Yi.Framework.Infrastructure/Uow/IUnitOfWorkManager.cs diff --git a/Yi.Furion.Rbac/Yi.Framework.Infrastructure/Sqlsugar/Uow/SqlsugarUnitOfWork.cs b/Yi.Furion.Rbac/Yi.Framework.Infrastructure/Sqlsugar/Uow/SqlsugarUnitOfWork.cs index 7c1ca7d7..fa6bbb3f 100644 --- a/Yi.Furion.Rbac/Yi.Framework.Infrastructure/Sqlsugar/Uow/SqlsugarUnitOfWork.cs +++ b/Yi.Furion.Rbac/Yi.Framework.Infrastructure/Sqlsugar/Uow/SqlsugarUnitOfWork.cs @@ -1,51 +1,71 @@ using Furion; +using Furion.DatabaseAccessor; using Furion.DependencyInjection; +using Microsoft.AspNetCore.Mvc.Filters; using Microsoft.Extensions.DependencyInjection; using SqlSugar; using Yi.Framework.Infrastructure.Ddd.Repositories; -using Yi.Framework.Infrastructure.Uow; namespace Yi.Framework.Infrastructure.Sqlsugar.Uow { - public class SqlsugarUnitOfWork : IUnitOfWork, ISingleton + public class SqlsugarUnitOfWork : IUnitOfWork { - public ISqlSugarClient Db { get; set; } - public ITenant Tenant { get; set; } - public bool IsTran { get; set; } - public bool IsCommit { get; set; } - public bool IsClose { get; set; } + // + /// SqlSugar 对象 + /// + private readonly ISqlSugarClient _sqlSugarClient; - public void Dispose() + /// + /// 构造函数 + /// + /// + public SqlsugarUnitOfWork(ISqlSugarClient sqlSugarClient) { - - if (IsTran && IsCommit == false) - { - Tenant.RollbackTran(); - } - if (Db.Ado.Transaction == null && IsClose == false) - { - Db.Close(); - } + _sqlSugarClient = sqlSugarClient; } - public bool Commit() + /// + /// 开启工作单元处理 + /// + /// + /// + /// + public void BeginTransaction(FilterContext context, UnitOfWorkAttribute unitOfWork) { - if (IsTran && IsCommit == false) - { - Tenant.CommitTran(); - IsCommit = true; - } - if (Db.Ado.Transaction == null && IsClose == false) - { - Db.Close(); - IsClose = true; - } - return IsCommit; + _sqlSugarClient.AsTenant().BeginTran(); } - public IRepository GetRepository() + /// + /// 提交工作单元处理 + /// + /// + /// + /// + public void CommitTransaction(FilterContext resultContext, UnitOfWorkAttribute unitOfWork) { - return App.GetRequiredService>(); + _sqlSugarClient.AsTenant().CommitTran(); + } + + /// + /// 回滚工作单元处理 + /// + /// + /// + /// + public void RollbackTransaction(FilterContext resultContext, UnitOfWorkAttribute unitOfWork) + { + _sqlSugarClient.AsTenant().RollbackTran(); + } + + /// + /// 执行完毕(无论成功失败) + /// + /// + /// + /// + public void OnCompleted(FilterContext context, FilterContext resultContext) + { + _sqlSugarClient.Dispose(); } } } diff --git a/Yi.Furion.Rbac/Yi.Framework.Infrastructure/Sqlsugar/Uow/SqlsugarUnitOfWorkManager.cs b/Yi.Furion.Rbac/Yi.Framework.Infrastructure/Sqlsugar/Uow/SqlsugarUnitOfWorkManager.cs deleted file mode 100644 index f4dc75a7..00000000 --- a/Yi.Furion.Rbac/Yi.Framework.Infrastructure/Sqlsugar/Uow/SqlsugarUnitOfWorkManager.cs +++ /dev/null @@ -1,38 +0,0 @@ -using Furion.DependencyInjection; -using SqlSugar; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; -using Yi.Framework.Infrastructure.Uow; - -namespace Yi.Framework.Infrastructure.Sqlsugar.Uow -{ - /// - /// 此部分为sqlsugr的魔改版本 - /// - internal class SqlsugarUnitOfWorkManager : IUnitOfWorkManager,ISingleton - { - public SqlsugarUnitOfWorkManager(ISqlSugarClient db) - { - Db = db; - } - public ISqlSugarClient Db { get; set; } - public IUnitOfWork CreateContext(bool isTran = true) - { - SqlsugarUnitOfWork uow = new SqlsugarUnitOfWork(); - return CreateContext(isTran, uow); - } - private IUnitOfWork CreateContext(bool isTran, SqlsugarUnitOfWork sugarUnitOf) - { - sugarUnitOf.Db = Db; - sugarUnitOf.Tenant = Db.AsTenant(); - sugarUnitOf.IsTran = isTran; - Db.Open(); - if (isTran) - Db.AsTenant().BeginTran(); - return sugarUnitOf; - } - } -} diff --git a/Yi.Furion.Rbac/Yi.Framework.Infrastructure/Startup.cs b/Yi.Furion.Rbac/Yi.Framework.Infrastructure/Startup.cs index f75e0f45..2d1ec8de 100644 --- a/Yi.Furion.Rbac/Yi.Framework.Infrastructure/Startup.cs +++ b/Yi.Furion.Rbac/Yi.Framework.Infrastructure/Startup.cs @@ -5,6 +5,7 @@ using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Hosting; using Yi.Framework.Infrastructure.AspNetCore; using Yi.Framework.Infrastructure.Sqlsugar; +using Yi.Framework.Infrastructure.Sqlsugar.Uow; namespace Yi.Framework.Infrastructure; @@ -17,6 +18,8 @@ public class Startup : AppStartup services.Configure(App.Configuration.GetSection("DbConnOptions")); services.AddDbSqlsugarContextServer(); + + services.AddUnitOfWork(); } public void Configure(IApplicationBuilder app, IWebHostEnvironment env) diff --git a/Yi.Furion.Rbac/Yi.Framework.Infrastructure/Uow/DefaultUnitOfWork.cs b/Yi.Furion.Rbac/Yi.Framework.Infrastructure/Uow/DefaultUnitOfWork.cs deleted file mode 100644 index fea60739..00000000 --- a/Yi.Furion.Rbac/Yi.Framework.Infrastructure/Uow/DefaultUnitOfWork.cs +++ /dev/null @@ -1,26 +0,0 @@ -using Yi.Framework.Infrastructure.Ddd.Repositories; - -namespace Yi.Framework.Infrastructure.Uow -{ - internal class DefaultUnitOfWork : IUnitOfWork - { - public DefaultUnitOfWork() { } - public bool IsTran { get; set; } - public bool IsCommit { get; set; } - public bool IsClose { get; set; } - - public bool Commit() - { - return true; - } - - public void Dispose() - { - } - - public IRepository GetRepository() - { - throw new NotImplementedException(); - } - } -} diff --git a/Yi.Furion.Rbac/Yi.Framework.Infrastructure/Uow/DefaultUnitOfWorkManager.cs b/Yi.Furion.Rbac/Yi.Framework.Infrastructure/Uow/DefaultUnitOfWorkManager.cs deleted file mode 100644 index 3c84aa5a..00000000 --- a/Yi.Furion.Rbac/Yi.Framework.Infrastructure/Uow/DefaultUnitOfWorkManager.cs +++ /dev/null @@ -1,10 +0,0 @@ -namespace Yi.Framework.Infrastructure.Uow -{ - internal class DefaultUnitOfWorkManager : IUnitOfWorkManager - { - public IUnitOfWork CreateContext(bool isTran = true) - { - return new DefaultUnitOfWork(); - } - } -} diff --git a/Yi.Furion.Rbac/Yi.Framework.Infrastructure/Uow/IUnitOfWork.cs b/Yi.Furion.Rbac/Yi.Framework.Infrastructure/Uow/IUnitOfWork.cs deleted file mode 100644 index b1e5e7b3..00000000 --- a/Yi.Furion.Rbac/Yi.Framework.Infrastructure/Uow/IUnitOfWork.cs +++ /dev/null @@ -1,14 +0,0 @@ -using Yi.Framework.Infrastructure.Ddd.Repositories; - -namespace Yi.Framework.Infrastructure.Uow -{ - public interface IUnitOfWork : IDisposable - { - bool IsTran { get; set; } - bool IsCommit { get; set; } - bool IsClose { get; set; } - - IRepository GetRepository(); - bool Commit(); - } -} diff --git a/Yi.Furion.Rbac/Yi.Framework.Infrastructure/Uow/IUnitOfWorkManager.cs b/Yi.Furion.Rbac/Yi.Framework.Infrastructure/Uow/IUnitOfWorkManager.cs deleted file mode 100644 index 25a53c64..00000000 --- a/Yi.Furion.Rbac/Yi.Framework.Infrastructure/Uow/IUnitOfWorkManager.cs +++ /dev/null @@ -1,8 +0,0 @@ -namespace Yi.Framework.Infrastructure.Uow -{ - public interface IUnitOfWorkManager - { - IUnitOfWork CreateContext(bool isTran = true); - } - -} \ No newline at end of file diff --git a/Yi.Furion.Rbac/Yi.Furion.Rbac.Application/System/Services/Impl/AccountService.cs b/Yi.Furion.Rbac/Yi.Furion.Rbac.Application/System/Services/Impl/AccountService.cs index 014d80c4..d7d89ba1 100644 --- a/Yi.Furion.Rbac/Yi.Furion.Rbac.Application/System/Services/Impl/AccountService.cs +++ b/Yi.Furion.Rbac/Yi.Furion.Rbac.Application/System/Services/Impl/AccountService.cs @@ -7,7 +7,6 @@ using Yi.Framework.Infrastructure.CurrentUsers; using Yi.Framework.Infrastructure.Ddd.Repositories; using Yi.Framework.Infrastructure.Ddd.Services; using Yi.Framework.Infrastructure.Exceptions; -using Yi.Framework.Infrastructure.Uow; using Yi.Framework.Module.ImageSharp.HeiCaptcha; using Yi.Framework.Module.Sms.Aliyun; using Yi.Furion.Rbac.Application.System.Domain; @@ -53,7 +52,6 @@ namespace Yi.Furion.Rbac.Application.System.Services.Impl private UserManager _userManager { get; set; } - private IUnitOfWorkManager _unitOfWorkManager { get; set; } private IRepository _roleRepository { get; set; } @@ -222,6 +220,7 @@ namespace Yi.Furion.Rbac.Application.System.Services.Impl /// /// [AllowAnonymous] + [UnitOfWork] public async Task PostRegisterAsync(RegisterDto input) { if (input.UserName == UserConst.Admin) @@ -251,8 +250,7 @@ namespace Yi.Furion.Rbac.Application.System.Services.Impl { throw new UserFriendlyException("用户已存在,注册失败"); } - using (var uow = _unitOfWorkManager.CreateContext()) - { + var newUser = new UserEntity(input.UserName, input.Password, input.Phone); var entity = await _userRepository.InsertReturnEntityAsync(newUser); @@ -263,9 +261,6 @@ namespace Yi.Furion.Rbac.Application.System.Services.Impl { await _userManager.GiveUserSetRoleAsync(new List { entity.Id }, new List { role.Id }); } - uow.Commit(); - } - return true; } diff --git a/Yi.Furion.Rbac/Yi.Furion.Rbac.Application/System/Services/Impl/RoleService.cs b/Yi.Furion.Rbac/Yi.Furion.Rbac.Application/System/Services/Impl/RoleService.cs index d9ef843f..5f0ecdcc 100644 --- a/Yi.Furion.Rbac/Yi.Furion.Rbac.Application/System/Services/Impl/RoleService.cs +++ b/Yi.Furion.Rbac/Yi.Furion.Rbac.Application/System/Services/Impl/RoleService.cs @@ -1,7 +1,6 @@ using SqlSugar; using Yi.Framework.Infrastructure.Ddd.Dtos; using Yi.Framework.Infrastructure.Ddd.Services; -using Yi.Framework.Infrastructure.Uow; using Yi.Furion.Rbac.Application.System.Domain; using Yi.Furion.Rbac.Application.System.Dtos.Role; using Yi.Furion.Rbac.Core.Entities; @@ -40,6 +39,7 @@ namespace Yi.Furion.Rbac.Application.System.Services.Impl /// /// /// + [UnitOfWork] public override async Task CreateAsync(RoleCreateInputVo input) { RoleGetOutputDto outputDto; @@ -61,6 +61,7 @@ namespace Yi.Furion.Rbac.Application.System.Services.Impl /// /// /// + [UnitOfWork] public override async Task UpdateAsync(long id, RoleUpdateInputVo input) { var dto = new RoleGetOutputDto(); diff --git a/Yi.Furion.Rbac/Yi.Furion.Rbac.Application/System/Services/Impl/UserService.cs b/Yi.Furion.Rbac/Yi.Furion.Rbac.Application/System/Services/Impl/UserService.cs index 93e335cf..e90f676b 100644 --- a/Yi.Furion.Rbac/Yi.Furion.Rbac.Application/System/Services/Impl/UserService.cs +++ b/Yi.Furion.Rbac/Yi.Furion.Rbac.Application/System/Services/Impl/UserService.cs @@ -3,7 +3,6 @@ using Yi.Framework.Infrastructure.CurrentUsers; using Yi.Framework.Infrastructure.Ddd.Dtos; using Yi.Framework.Infrastructure.Ddd.Services; using Yi.Framework.Infrastructure.Exceptions; -using Yi.Framework.Infrastructure.Uow; using Yi.Framework.Module.OperLogManager; using Yi.Furion.Rbac.Application.System.Domain; using Yi.Furion.Rbac.Application.System.Dtos.User; @@ -73,6 +72,7 @@ namespace Yi.Furion.Rbac.Application.System.Services.Impl /// /// [OperLog("添加用户", OperEnum.Insert)] + [UnitOfWork] public async override Task CreateAsync(UserCreateInputVo input) { if (string.IsNullOrEmpty(input.Password)) @@ -118,6 +118,7 @@ namespace Yi.Furion.Rbac.Application.System.Services.Impl /// /// [OperLog("更新用户", OperEnum.Update)] + [UnitOfWork] public async override Task UpdateAsync(long id, UserUpdateInputVo input) { if (await _repository.IsAnyAsync(u => input.UserName!.Equals(u.UserName) && !id.Equals(u.Id)))