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();
}
}
}
}