Пример #1
0
    public static async Task AsyncPipelineBuilderTest()
    {
        var requestContext = new RequestContext()
        {
            RequesterName = "Michael",
            Hour          = 12,
        };

        var builder = PipelineBuilder.CreateAsync <RequestContext>(context =>
        {
            Console.WriteLine($"{context.RequesterName} {context.Hour}h apply failed");
            return(Task.CompletedTask);
        })
                      .Use(async(context, next) =>
        {
            if (context.Hour <= 2)
            {
                Console.WriteLine("pass 1");
            }
            else
            {
                await next();
            }
        })
                      .Use(async(context, next) =>
        {
            if (context.Hour <= 4)
            {
                Console.WriteLine("pass 2");
            }
            else
            {
                await next();
            }
        })
                      .Use(async(context, next) =>
        {
            if (context.Hour <= 6)
            {
                Console.WriteLine("pass 3");
            }
            else
            {
                await next();
            }
        })
        ;
        var requestPipeline = builder.Build();

        Console.WriteLine();
        foreach (var i in Enumerable.Range(1, 8))
        {
            Console.WriteLine($"--------- h:{i} apply AsyncPipeline------------------");
            requestContext.Hour = i;
            await requestPipeline.Invoke(requestContext);

            Console.WriteLine("----------------------------");
        }
    }
Пример #2
0
        private static Func <IInvocation, Task> GetAspectDelegate(IInvocation invocation, IReadOnlyCollection <IInterceptor> interceptors)
        {
            // ReSharper disable once ConvertToLocalFunction
            Func <IInvocation, Task> completeFunc = x =>
            {
                invocation.ReturnValue = x.Method?.Invoke(x.Target, x.Arguments);
                if (invocation.ProxyMethod.ReturnType == typeof(void))
                {
                    return(TaskHelper.CompletedTask);
                }

                if (invocation.ReturnValue is Task task)
                {
                    return(task);
                }
#if NETSTANDARD2_1
                if (invocation.ReturnValue is ValueTask valTask)
                {
                    return(valTask.AsTask());
                }
#endif

                return(TaskHelper.CompletedTask);
            };

            // ReSharper disable once ConvertIfStatementToNullCoalescingAssignment
            if (null == interceptors)
            {
                interceptors = (FluentAspects.AspectOptions.InterceptorResolver ??
                                FluentConfigInterceptorResolver.Instance)
                               .ResolveInterceptors(invocation) ?? ArrayHelper.Empty <IInterceptor>();
            }

            if (interceptors.Count == 0)
            {
                return(completeFunc);
            }

            var builder = PipelineBuilder.CreateAsync(completeFunc);

            foreach (var interceptor in interceptors)
            {
                builder.Use(interceptor.Invoke);
            }

            return(builder.Build());
        }
Пример #3
0
        private static Func <IInvocation, Task> GetAspectDelegate(IInvocation invocation, IReadOnlyList <IInterceptor> interceptors, Func <IInvocation, Task> completeFunc)
        {
            // ReSharper disable once ConvertToLocalFunction
            // ReSharper disable once ConvertIfStatementToNullCoalescingAssignment
            if (null == completeFunc)
            {
                completeFunc = x =>
                {
                    if (x.Method != null && !x.Method.IsAbstract)
                    {
                        if (x.Target == x.ProxyTarget)
                        {
                            // https://stackoverflow.com/questions/2323401/how-to-call-base-base-method
                            var ptr          = x.Method.MethodHandle.GetFunctionPointer();
                            var delegateType = DelegateHelper.GetDelegateType(x.Method);
                            var @delegate    = (Delegate)Activator.CreateInstance(delegateType, x.Target, ptr);
                            invocation.ReturnValue = @delegate.DynamicInvoke(x.Arguments);
                        }
                        else
                        {
                            invocation.ReturnValue = x.Method.Invoke(x.Target, x.Arguments);
                        }
                    }

                    if (invocation.ProxyMethod.ReturnType == typeof(void))
                    {
                        return(TaskHelper.CompletedTask);
                    }
                    if (invocation.ReturnValue is Task task)
                    {
                        return(task);
                    }

#if NETSTANDARD2_1
                    if (invocation.ReturnValue is ValueTask valTask)
                    {
                        return(valTask.AsTask());
                    }
#endif

                    return(TaskHelper.CompletedTask);
                };
            }

            // ReSharper disable once ConvertIfStatementToNullCoalescingAssignment
            if (null == interceptors)
            {
                interceptors = FluentAspects.AspectOptions.InterceptorResolver
                               .ResolveInterceptors(invocation) ?? ArrayHelper.Empty <IInterceptor>();
            }

            if (interceptors.Count <= 1 && interceptors[0] is TryInvokeInterceptor)
            {
                return(completeFunc);
            }

            var builder = PipelineBuilder.CreateAsync(completeFunc);
            foreach (var interceptor in interceptors)
            {
                builder.Use(interceptor.Invoke);
            }
            return(builder.Build());
        }