Exemplo n.º 1
0
        /// <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();//直接执行被拦截方法
            }
        }
Exemplo n.º 2
0
        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);
            }
        }
Exemplo n.º 4
0
        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);
            }
        }