using Microsoft.AspNetCore.Mvc.Controllers; using Microsoft.AspNetCore.Mvc.Filters; using SqlSugar; using System.Linq; using System.Threading.Tasks; namespace Myshipping.Core; /// /// SqlSugar 工作单元拦截器 /// public class SqlSugarUnitOfWorkFilter : IAsyncActionFilter, IOrderedFilter { /// /// 过滤器排序 /// internal const int FilterOrder = 9999; /// /// 排序属性 /// public int Order => FilterOrder; /// /// SqlSugar 对象 /// private readonly SqlSugarScope _sqlSugarClient; /// /// 构造函数 /// /// public SqlSugarUnitOfWorkFilter(ISqlSugarClient sqlSugarClient) { _sqlSugarClient = (SqlSugarScope)sqlSugarClient; } /// /// /// /// /// /// 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(); } } } }