using Admin.Core.Common; using Admin.Core.Repository; using Castle.DynamicProxy; using System; using System.Linq; using System.Reflection; using System.Threading.Tasks; namespace Admin.Core.Extensions { /// /// 事务拦截器AdminTranAOP 继承IInterceptor接口 /// public class AdminTranAOP : IInterceptor { private readonly IUnitOfWork _unitOfWork; public AdminTranAOP(IUnitOfWork unitOfWork) { _unitOfWork = unitOfWork; } /// /// 实例化IInterceptor唯一方法 /// /// 包含被拦截方法的信息 public void Intercept(IInvocation invocation) { var method = invocation.MethodInvocationTarget ?? invocation.Method; //对当前方法的特性验证 //如果需要验证 if (method.GetCustomAttributes(true).FirstOrDefault(x => x.GetType() == typeof(UseTranAttribute)) is UseTranAttribute) { try { Console.WriteLine($"Begin Transaction"); _unitOfWork.BeginTran(); invocation.Proceed(); // 异步获取异常,先执行 if (IsAsyncMethod(invocation.Method)) { var result = invocation.ReturnValue; if (result is Task) { Task.WaitAll(result as Task); } } _unitOfWork.CommitTran(); } catch (Exception) { Console.WriteLine($"Rollback Transaction"); _unitOfWork.RollbackTran(); } } else { invocation.Proceed();//直接执行被拦截方法 } } private async Task SuccessAction(IInvocation invocation) { await Task.Run(() => { //... }); } public static bool IsAsyncMethod(MethodInfo method) { return ( method.ReturnType == typeof(Task) || (method.ReturnType.IsGenericType && method.ReturnType.GetGenericTypeDefinition() == typeof(Task<>)) ); } private async Task TestActionAsync(IInvocation invocation) { await Task.Run(null); } } }