You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
BookingHeChuan/Myshipping.Core/Filter/SqlSugarUnitOfWorkFilter.cs

91 lines
2.4 KiB
C#

using Microsoft.AspNetCore.Mvc.Controllers;
using Microsoft.AspNetCore.Mvc.Filters;
using SqlSugar;
using System.Linq;
using System.Threading.Tasks;
namespace Myshipping.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 SqlSugarScope _sqlSugarClient;
/// <summary>
/// 构造函数
/// </summary>
/// <param name="sqlSugarClient"></param>
public SqlSugarUnitOfWorkFilter(ISqlSugarClient sqlSugarClient)
{
_sqlSugarClient = (SqlSugarScope)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();
}
}
}
}