Просмотр исходного кода

升级新版工作单元 UnitOfWork

zuohuaijun 3 лет назад
Родитель
Сommit
308726ff31

+ 2 - 2
Admin.NET/Admin.NET.Core/Admin.NET.Core.csproj

@@ -30,10 +30,10 @@
     <PackageReference Include="OnceMi.AspNetCore.OSS" Version="1.1.5" />
     <PackageReference Include="SKIT.FlurlHttpClient.Wechat.Api" Version="2.16.0" />
     <PackageReference Include="SKIT.FlurlHttpClient.Wechat.TenpayV3" Version="2.10.0" />
-    <PackageReference Include="SqlSugarCore" Version="5.0.9.1" />
+    <PackageReference Include="SqlSugarCore" Version="5.0.9.2" />
     <PackageReference Include="System.Linq.Dynamic.Core" Version="1.2.19" />
     <PackageReference Include="UAParser" Version="3.1.47" />
-    <PackageReference Include="Yitter.IdGenerator" Version="1.0.12" />
+    <PackageReference Include="Yitter.IdGenerator" Version="1.0.13" />
   </ItemGroup>
 
   <ItemGroup>

+ 59 - 62
Admin.NET/Admin.NET.Core/Admin.NET.Core.xml

@@ -19,34 +19,6 @@
             非实体表特性
             </summary>
         </member>
-        <member name="T:Admin.NET.Core.SqlSugarUnitOfWorkAttribute">
-            <summary>
-            SqlSugar工作单元配置特性
-            </summary>
-        </member>
-        <member name="M:Admin.NET.Core.SqlSugarUnitOfWorkAttribute.#ctor">
-            <summary>
-            构造函数
-            </summary>
-        </member>
-        <member name="M:Admin.NET.Core.SqlSugarUnitOfWorkAttribute.#ctor(System.Data.IsolationLevel)">
-            <summary>
-            构造函数
-            </summary>
-            <remarks>
-            <para>支持传入事务隔离级别 <see cref="P:Admin.NET.Core.SqlSugarUnitOfWorkAttribute.IsolationLevel"/> 参数值</para>
-            </remarks>
-            <param name="isolationLevel">事务隔离级别</param>
-        </member>
-        <member name="P:Admin.NET.Core.SqlSugarUnitOfWorkAttribute.IsolationLevel">
-            <summary>
-            事务隔离级别
-            </summary>
-            <remarks>
-            <para>默认:<see cref="F:System.Data.IsolationLevel.ReadCommitted"/>,参见:<see cref="P:Admin.NET.Core.SqlSugarUnitOfWorkAttribute.IsolationLevel"/></para>
-            <para>说明:当事务A更新某条数据的时候,不容许其他事务来更新该数据,但可以进行读取操作</para>
-            </remarks>
-        </member>
         <member name="M:Admin.NET.Core.CSRedisSetup.AddCSRedisSetup(Microsoft.Extensions.DependencyInjection.IServiceCollection)">
             <summary>
             CSRedis初始化
@@ -2810,40 +2782,6 @@
             请求操作拦截
             </summary>
         </member>
-        <member name="T:Admin.NET.Core.SqlSugarUnitOfWorkFilter">
-            <summary>
-            SqlSugar工作单元拦截器
-            </summary>
-        </member>
-        <member name="F:Admin.NET.Core.SqlSugarUnitOfWorkFilter.FilterOrder">
-            <summary>
-            过滤器排序
-            </summary>
-        </member>
-        <member name="P:Admin.NET.Core.SqlSugarUnitOfWorkFilter.Order">
-            <summary>
-            排序属性
-            </summary>
-        </member>
-        <member name="F:Admin.NET.Core.SqlSugarUnitOfWorkFilter._sqlSugarClient">
-            <summary>
-            SqlSugar 对象
-            </summary>
-        </member>
-        <member name="M:Admin.NET.Core.SqlSugarUnitOfWorkFilter.#ctor(SqlSugar.ISqlSugarClient)">
-            <summary>
-            构造函数
-            </summary>
-            <param name="sqlSugarClient"></param>
-        </member>
-        <member name="M:Admin.NET.Core.SqlSugarUnitOfWorkFilter.OnActionExecutionAsync(Microsoft.AspNetCore.Mvc.Filters.ActionExecutingContext,Microsoft.AspNetCore.Mvc.Filters.ActionExecutionDelegate)">
-             <summary>
-            
-             </summary>
-             <param name="context"></param>
-             <param name="next"></param>
-             <returns></returns>
-        </member>
         <member name="T:Admin.NET.Core.ChatHub">
             <summary>
             聊天集线器
@@ -6690,6 +6628,65 @@
             配置租户实体过滤器
             </summary>
         </member>
+        <member name="T:Admin.NET.Core.SqlSugarUnitOfWork">
+            <summary>
+            SqlSugar工作单元模式
+            </summary>
+        </member>
+        <member name="F:Admin.NET.Core.SqlSugarUnitOfWork._sqlSugarClient">
+            <summary>
+            SqlSugar 对象
+            </summary>
+        </member>
+        <member name="M:Admin.NET.Core.SqlSugarUnitOfWork.#ctor(SqlSugar.ISqlSugarClient)">
+            <summary>
+            构造函数
+            </summary>
+            <param name="sqlSugarClient"></param>
+        </member>
+        <member name="M:Admin.NET.Core.SqlSugarUnitOfWork.OnUnmark(Microsoft.AspNetCore.Mvc.Filters.ActionExecutedContext,System.Boolean)">
+            <summary>
+            工作单元未标记处理
+            </summary>
+            <param name="resultContext"></param>
+            <param name="isManual"></param>
+            <exception cref="T:System.NotImplementedException"></exception>
+        </member>
+        <member name="M:Admin.NET.Core.SqlSugarUnitOfWork.BeginTransaction(Microsoft.AspNetCore.Mvc.Filters.ActionExecutingContext,Furion.DatabaseAccessor.UnitOfWorkAttribute,System.Boolean)">
+            <summary>
+            开启工作单元处理
+            </summary>
+            <param name="context"></param>
+            <param name="unitOfwork"></param>
+            <param name="isManual"></param>
+            <exception cref="T:System.NotImplementedException"></exception>
+        </member>
+        <member name="M:Admin.NET.Core.SqlSugarUnitOfWork.CommitTransaction(Microsoft.AspNetCore.Mvc.Filters.ActionExecutedContext,Furion.DatabaseAccessor.UnitOfWorkAttribute,System.Boolean)">
+            <summary>
+            提交工作单元处理
+            </summary>
+            <param name="resultContext"></param>
+            <param name="unitOfwork"></param>
+            <param name="isManual"></param>
+            <exception cref="T:System.NotImplementedException"></exception>
+        </member>
+        <member name="M:Admin.NET.Core.SqlSugarUnitOfWork.RollbackTransaction(Microsoft.AspNetCore.Mvc.Filters.ActionExecutedContext,Furion.DatabaseAccessor.UnitOfWorkAttribute,System.Boolean)">
+            <summary>
+            回滚工作单元处理
+            </summary>
+            <param name="resultContext"></param>
+            <param name="unitOfwork"></param>
+            <param name="isManual"></param>
+            <exception cref="T:System.NotImplementedException"></exception>
+        </member>
+        <member name="M:Admin.NET.Core.SqlSugarUnitOfWork.OnCompleted(Microsoft.AspNetCore.Mvc.Filters.ActionExecutingContext,Microsoft.AspNetCore.Mvc.Filters.ActionExecutedContext)">
+            <summary>
+            执行完毕(无论成功失败)
+            </summary>
+            <param name="context"></param>
+            <param name="resultContext"></param>
+            <exception cref="T:System.NotImplementedException"></exception>
+        </member>
         <member name="T:Admin.NET.Core.AdminResultProvider">
             <summary>
             全局规范化结果

+ 0 - 36
Admin.NET/Admin.NET.Core/Attribute/SqlSugarUnitOfWorkAttribute.cs

@@ -1,36 +0,0 @@
-namespace Admin.NET.Core;
-
-/// <summary>
-/// SqlSugar工作单元配置特性
-/// </summary>
-[SuppressSniffer, AttributeUsage(AttributeTargets.Method, Inherited = true)]
-public class SqlSugarUnitOfWorkAttribute : Attribute
-{
-    /// <summary>
-    /// 构造函数
-    /// </summary>
-    public SqlSugarUnitOfWorkAttribute()
-    {
-    }
-
-    /// <summary>
-    /// 构造函数
-    /// </summary>
-    /// <remarks>
-    /// <para>支持传入事务隔离级别 <see cref="IsolationLevel"/> 参数值</para>
-    /// </remarks>
-    /// <param name="isolationLevel">事务隔离级别</param>
-    public SqlSugarUnitOfWorkAttribute(IsolationLevel isolationLevel)
-    {
-        IsolationLevel = isolationLevel;
-    }
-
-    /// <summary>
-    /// 事务隔离级别
-    /// </summary>
-    /// <remarks>
-    /// <para>默认:<see cref="IsolationLevel.ReadCommitted"/>,参见:<see cref="IsolationLevel"/></para>
-    /// <para>说明:当事务A更新某条数据的时候,不容许其他事务来更新该数据,但可以进行读取操作</para>
-    /// </remarks>
-    public IsolationLevel IsolationLevel { get; set; } = IsolationLevel.ReadCommitted;
-}

+ 0 - 84
Admin.NET/Admin.NET.Core/Filter/SqlSugarUnitOfWorkFilter.cs

@@ -1,84 +0,0 @@
-namespace Admin.NET.Core;
-
-/// <summary>
-/// SqlSugar工作单元拦截器
-/// </summary>
-public class SqlSugarUnitOfWorkFilter : IAsyncActionFilter, IOrderedFilter
-{
-    /// <summary>
-    /// 过滤器排序
-    /// </summary>
-    internal const int FilterOrder = 9999;
-
-    /// <summary>
-    /// 排序属性
-    /// </summary>
-    public int Order => FilterOrder;
-
-    /// <summary>
-    /// SqlSugar 对象
-    /// </summary>
-    private readonly SqlSugarClient _sqlSugarClient;
-
-    /// <summary>
-    /// 构造函数
-    /// </summary>
-    /// <param name="sqlSugarClient"></param>
-
-    public SqlSugarUnitOfWorkFilter(ISqlSugarClient sqlSugarClient)
-    {
-        _sqlSugarClient = (SqlSugarClient)sqlSugarClient;
-    }
-
-    /// <summary>
-    ///
-    /// </summary>
-    /// <param name="context"></param>
-    /// <param name="next"></param>
-    /// <returns></returns>
-    public async Task OnActionExecutionAsync(ActionExecutingContext context, ActionExecutionDelegate next)
-    {
-        // 获取动作方法描述器
-        var actionDescriptor = context.ActionDescriptor as ControllerActionDescriptor;
-        var method = actionDescriptor.MethodInfo;
-
-        // 判断是否贴有工作单元特性
-        if (!method.IsDefined(typeof(SqlSugarUnitOfWorkAttribute), true))
-        {
-            // 调用方法
-            _ = await next();
-        }
-        else
-        {
-            var attribute = (method.GetCustomAttributes(typeof(SqlSugarUnitOfWorkAttribute), true).FirstOrDefault() as SqlSugarUnitOfWorkAttribute);
-
-            // 开启事务
-            _sqlSugarClient.Ado.BeginTran(attribute.IsolationLevel);
-
-            // 调用方法
-            var resultContext = await next();
-
-            if (resultContext.Exception == null)
-            {
-                try
-                {
-                    _sqlSugarClient.Ado.CommitTran();
-                }
-                catch
-                {
-                    _sqlSugarClient.Ado.RollbackTran();
-                }
-                finally
-                {
-                    _sqlSugarClient.Ado.Dispose();
-                }
-            }
-            else
-            {
-                // 回滚事务
-                _sqlSugarClient.Ado.RollbackTran();
-                _sqlSugarClient.Ado.Dispose();
-            }
-        }
-    }
-}

+ 1 - 0
Admin.NET/Admin.NET.Core/GlobalUsings.cs

@@ -2,6 +2,7 @@
 global using Admin.NET.Core.Util;
 global using Furion;
 global using Furion.ConfigurableOptions;
+global using Furion.DatabaseAccessor;
 global using Furion.DataEncryption;
 global using Furion.DataValidation;
 global using Furion.DependencyInjection;

+ 1 - 1
Admin.NET/Admin.NET.Core/Service/DataResources/SysDataResourceService.cs

@@ -84,7 +84,7 @@ public class SysDataResourceService : IDynamicApiController, ITransient
     /// <param name="input"></param>
     /// <returns></returns>
     [HttpPost("/sysDataResource/update")]
-    [SqlSugarUnitOfWork]
+    [UnitOfWork]
     public async Task UpdateDataResource(UpdateDataResourceInput input)
     {
         if (input.Pid != 0)

+ 1 - 1
Admin.NET/Admin.NET.Core/Service/Menu/SysMenuService.cs

@@ -128,7 +128,7 @@ public class SysMenuService : IDynamicApiController, ITransient
     /// <param name="input"></param>
     /// <returns></returns>
     [HttpPost("/sysMenu/delete")]
-    [SqlSugarUnitOfWork]
+    [UnitOfWork]
     public async Task DeleteMenu(DeleteMenuInput input)
     {
         var menuTreeList = await _sysMenuRep.AsQueryable().ToChildListAsync(u => u.Pid, input.Id);

+ 1 - 1
Admin.NET/Admin.NET.Core/Service/Org/SysOrgService.cs

@@ -113,7 +113,7 @@ public class SysOrgService : IDynamicApiController, ITransient
     /// <param name="input"></param>
     /// <returns></returns>
     [HttpPost("/sysOrg/update")]
-    [SqlSugarUnitOfWork]
+    [UnitOfWork]
     public async Task UpdateOrg(UpdateOrgInput input)
     {
         if (input.Pid != 0)

+ 1 - 1
Admin.NET/Admin.NET.Core/Service/Role/SysRoleMenuService.cs

@@ -48,7 +48,7 @@ public class SysRoleMenuService : ITransient
     /// </summary>
     /// <param name="input"></param>
     /// <returns></returns>
-    [SqlSugarUnitOfWork]
+    [UnitOfWork]
     public async Task GrantRoleMenu(RoleMenuInput input)
     {
         await _sysRoleMenuRep.DeleteAsync(u => u.RoleId == input.Id);

+ 1 - 1
Admin.NET/Admin.NET.Core/Service/Role/SysRoleOrgService.cs

@@ -17,7 +17,7 @@ public class SysRoleOrgService : ITransient
     /// </summary>
     /// <param name="input"></param>
     /// <returns></returns>
-    [SqlSugarUnitOfWork]
+    [UnitOfWork]
     public async Task GrantRoleOrg(RoleOrgInput input)
     {
         await _sysRoleOrgRep.DeleteAsync(u => u.RoleId == input.Id);

+ 1 - 1
Admin.NET/Admin.NET.Core/Service/Role/SysRoleService.cs

@@ -103,7 +103,7 @@ public class SysRoleService : IDynamicApiController, ITransient
     /// <param name="input"></param>
     /// <returns></returns>
     [HttpPost("/sysRole/delete")]
-    [SqlSugarUnitOfWork]
+    [UnitOfWork]
     public async Task DeleteRole(DeleteRoleInput input)
     {
         var sysRole = await _sysRoleRep.GetFirstAsync(u => u.Id == input.Id);

+ 1 - 1
Admin.NET/Admin.NET.Core/Service/User/SysUserExtOrgPosService.cs

@@ -18,7 +18,7 @@ public class SysUserExtOrgPosService : ITransient
     /// <param name="userId"></param>
     /// <param name="extIdList"></param>
     /// <returns></returns>
-    [SqlSugarUnitOfWork]
+    [UnitOfWork]
     public async Task AddOrUpdate(long userId, List<UserExtOrgPosOutput> extIdList)
     {
         await DeleteEmpExtByUserId(userId); // 先删除

+ 1 - 1
Admin.NET/Admin.NET.Core/Service/User/SysUserOrgService.cs

@@ -17,7 +17,7 @@ public class SysUserOrgService : ITransient
     /// </summary>
     /// <param name="input"></param>
     /// <returns></returns>
-    [SqlSugarUnitOfWork]
+    [UnitOfWork]
     public async Task GrantUserOrg(UserOrgInput input)
     {
         await _sysUserOrgRep.DeleteAsync(u => u.UserId == input.Id);

+ 1 - 1
Admin.NET/Admin.NET.Core/Service/User/SysUserRoleService.cs

@@ -17,7 +17,7 @@ public class SysUserRoleService : ITransient
     /// </summary>
     /// <param name="input"></param>
     /// <returns></returns>
-    [SqlSugarUnitOfWork]
+    [UnitOfWork]
     public async Task GrantUserRole(UserRoleInput input)
     {
         await _sysUserRoleRep.DeleteAsync(u => u.UserId == input.Id);

+ 1 - 0
Admin.NET/Admin.NET.Core/SqlSugar/SqlSugarSetup.cs

@@ -133,6 +133,7 @@ public static class SqlSugarSetup
             return sqlSugar;
         });
         services.AddScoped(typeof(SqlSugarRepository<>)); // 注册仓储
+        services.AddUnitOfWork<SqlSugarUnitOfWork>(); // 注册工作单元
     }
 
     /// <summary>

+ 79 - 0
Admin.NET/Admin.NET.Core/SqlSugar/SqlSugarUnitOfWork.cs

@@ -0,0 +1,79 @@
+namespace Admin.NET.Core;
+
+/// <summary>
+/// SqlSugar工作单元模式
+/// </summary>
+[SuppressSniffer]
+public sealed class SqlSugarUnitOfWork : IUnitOfWork
+{
+    /// <summary>
+    /// SqlSugar 对象
+    /// </summary>
+    private readonly SqlSugarClient _sqlSugarClient;
+
+    /// <summary>
+    /// 构造函数
+    /// </summary>
+    /// <param name="sqlSugarClient"></param>
+    public SqlSugarUnitOfWork(ISqlSugarClient sqlSugarClient)
+    {
+        _sqlSugarClient = (SqlSugarClient)sqlSugarClient;
+    }
+
+    /// <summary>
+    /// 工作单元未标记处理
+    /// </summary>
+    /// <param name="resultContext"></param>
+    /// <param name="isManual"></param>
+    /// <exception cref="NotImplementedException"></exception>
+    public void OnUnmark(ActionExecutedContext resultContext, bool isManual)
+    {
+    }
+
+    /// <summary>
+    /// 开启工作单元处理
+    /// </summary>
+    /// <param name="context"></param>
+    /// <param name="unitOfwork"></param>
+    /// <param name="isManual"></param>
+    /// <exception cref="NotImplementedException"></exception>
+    public void BeginTransaction(ActionExecutingContext context, UnitOfWorkAttribute unitOfwork, bool isManual)
+    {
+        _sqlSugarClient.BeginTran();
+    }
+
+    /// <summary>
+    /// 提交工作单元处理
+    /// </summary>
+    /// <param name="resultContext"></param>
+    /// <param name="unitOfwork"></param>
+    /// <param name="isManual"></param>
+    /// <exception cref="NotImplementedException"></exception>
+    public void CommitTransaction(ActionExecutedContext resultContext, UnitOfWorkAttribute unitOfwork, bool isManual)
+    {
+        _sqlSugarClient.CommitTran();
+    }
+
+    /// <summary>
+    /// 回滚工作单元处理
+    /// </summary>
+    /// <param name="resultContext"></param>
+    /// <param name="unitOfwork"></param>
+    /// <param name="isManual"></param>
+    /// <exception cref="NotImplementedException"></exception>
+    public void RollbackTransaction(ActionExecutedContext resultContext, UnitOfWorkAttribute unitOfwork, bool isManual)
+    {
+        _sqlSugarClient.RollbackTran();
+    }
+
+    /// <summary>
+    /// 执行完毕(无论成功失败)
+    /// </summary>
+    /// <param name="context"></param>
+    /// <param name="resultContext"></param>
+    /// <exception cref="NotImplementedException"></exception>
+    public void OnCompleted(ActionExecutingContext context, ActionExecutedContext resultContext)
+    {
+        _sqlSugarClient.Dispose();
+    }
+}