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("----------------------------"); } }
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()); }
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()); }