/// <summary> /// 实例化IInterceptor唯一方法 /// </summary> /// <param name="invocation"></param> public void Intercept(IInvocation invocation) { var method = invocation.MethodInvocationTarget ?? invocation.Method; //对当前方法的特性验证 //如果需要验证 if (method.GetCustomAttributes(true).Find(x => x.GetType() == typeof(UseTranAttribute)) is UseTranAttribute) { try { Console.WriteLine($"UnintOfWord strat"); _unitOfWork.BeginTran(); invocation.Proceed(); // 异步获取异常,普通的 try catch 外层不能达到目的,毕竟是异步的 if (IsAsyncMethod(invocation.Method)) { if (invocation.Method.ReturnType == typeof(Task)) { invocation.ReturnValue = InternalAsyncHelper.AwaitTaskWithPostActionAndFinally( (Task)invocation.ReturnValue, async() => await TestActionAsync(invocation), ex => { _unitOfWork.Rollback(); //事务回滚 }); } else //Task<TResult> { invocation.ReturnValue = InternalAsyncHelper.CallAwaitTaskWithPostActionAndFinallyAndGetResult( invocation.Method.ReturnType.GenericTypeArguments[0], invocation.ReturnValue, async() => await TestActionAsync(invocation), ex => { _unitOfWork.Rollback(); //事务回滚 }); } } _unitOfWork.Commit(); } catch (Exception) { Console.WriteLine($"Rollback Transaction"); _unitOfWork.Rollback(); } } else { invocation.Proceed();//直接执行被拦截方法 } }
private void PerformAsyncUow(IInvocation invocation, UnitOfWorkOptions options) { var uow = _unitOfWorkManager.Begin(options); try { invocation.Proceed(); } catch { uow.Dispose(); throw; } if (invocation.Method.ReturnType == typeof(Task)) { invocation.ReturnValue = InternalAsyncHelper.AwaitTaskWithPostActionAndFinally( (Task)invocation.ReturnValue, async() => { uow.Complete(); await Task.FromResult(0); }, exception => uow.Dispose() ); } else //Task<TResult> { invocation.ReturnValue = InternalAsyncHelper.CallAwaitTaskWithPostActionAndFinallyAndGetResult( invocation.Method.ReturnType.GenericTypeArguments[0], invocation.ReturnValue, async() => { uow.Complete(); await Task.FromResult(0); }, exception => uow.Dispose() ); } }
private void ProceedAndCallPostTreatment <T>(IInvocation invocation, List <T> pEntities, bool IsAsync) { invocation.Proceed(); if (IsAsync) { ////Wait task execution and modify return value if (invocation.Method.ReturnType == typeof(Task)) { invocation.ReturnValue = InternalAsyncHelper.AwaitTaskWithPostActionAndFinally( (Task)invocation.ReturnValue, async() => { GenericPostTreatment(invocation, pEntities); }, ex => { }); } else //Task<TResult> { invocation.ReturnValue = InternalAsyncHelper.CallAwaitTaskWithPostActionAndFinallyAndGetResult( invocation.Method.ReturnType.GenericTypeArguments[0], invocation.ReturnValue, async(e) => { invocation.ReturnValue = e; GenericPostTreatment(invocation, pEntities); }, ex => { }); } } else { this.GenericPostTreatment(invocation, pEntities); } }
public void Intercept(IInvocation invocation) { // 记录被拦截方法信息的日志信息 var interceptorInfo = "" + $"【当前执行方法】:{ invocation.Method.Name} \r\n" + $"【携带的参数有】: {string.Join(", ", invocation.Arguments.Select(a => (a ?? "").ToString()).ToArray())} \r\n"; try { // 在被拦截的方法执行完毕后 继续执行当前方法,注意是被拦截的是异步的 invocation.Proceed(); // 异步获取异常,先执行 if (IsAsyncMethod(invocation.Method)) { #region 方案一 // Wait task execution and modify return value if (invocation.Method.ReturnType == typeof(Task)) { invocation.ReturnValue = InternalAsyncHelper.AwaitTaskWithPostActionAndFinally( (Task)invocation.ReturnValue, async() => await SuccessAction(invocation, interceptorInfo), /*成功时执行*/ ex => { System.Console.WriteLine(ex.Message); }); } // Task<TResult> else { invocation.ReturnValue = InternalAsyncHelper.CallAwaitTaskWithPostActionAndFinallyAndGetResult( invocation.Method.ReturnType.GenericTypeArguments[0], invocation.ReturnValue, async(o) => await SuccessAction(invocation, interceptorInfo, o),/*成功时执行*/ ex => { System.Console.WriteLine(ex); }); } #endregion // 如果方案一不行,试试这个方案 #region 方案二 //var type = invocation.Method.ReturnType; //var resultProperty = type.GetProperty("Result"); //dataIntercept += ($"【执行完成结果】:{JsonConvert.SerializeObject(resultProperty.GetValue(invocation.ReturnValue))}"); //Parallel.For(0, 1, e => //{ // LogLock.OutSql2Log("AOPLog", new string[] { dataIntercept }); //}); #endregion } else { // 同步1 interceptorInfo += ($"【执行完成结果】:{invocation.ReturnValue}"); Parallel.For(0, 1, e => { System.Console.WriteLine(interceptorInfo); }); } } catch (Exception ex)// 同步2 { System.Console.WriteLine(ex.Message + interceptorInfo); } }