public IPipeElement <TContext, TReturn, TReturnOfNextStep> DoNext <TReturnOfNextStep, TStepProvider>() { return(Element <TContext, TReturn, TReturnOfNextStep> .Create( Context, PreviousElements.Append(this), Context.ServiceProvider.GetRequiredService <TStepProvider>())); }
public async Task <TReturn> CompletePipeAsync() { var firstElement = (IStartElement)PreviousElements.First(); var input = firstElement.Input; var context = firstElement.Context; var cache = default(IMemoryCache); foreach (var element in PreviousElements) { try { var output = element.GenericSyncProvider != null ? element.GenericSyncProvider.InternalDo(context, input) : element.GenericAsyncProvider != null ? await element.GenericAsyncProvider.InternalDoAsync(context, input).ConfigureAwait(false) : throw new InvalidOperationException("No provider set for step."); if (context.EnableCache && context.CacheFromThisStep && context.CacheKey != null) { context.CacheFromThisStep = false; cache ??= context.ServiceProvider.GetRequiredService <IMemoryCache>(); if (cache.TryGetValue <TReturn>(context.CacheKey, out var cachedReturn)) { return(cachedReturn); } } input = output; } catch (Exception ex) { Context.ThrownException = ex; return(SyncProvider != null ? SyncProvider.Do(Context, default) : AsyncProvider != null ? await AsyncProvider.DoAsync(Context, default).ConfigureAwait(false) : throw new InvalidOperationException("No provider set for final step.")); } } var result = SyncProvider != null ? SyncProvider.Do(Context, (TInput)input) : AsyncProvider != null ? await AsyncProvider.DoAsync(Context, (TInput)input).ConfigureAwait(false) : throw new InvalidOperationException("No provider set for final step."); if (context.EnableCache && context.CacheKey != null && cache != null) { cache.Set(context.CacheKey, result, context.CacheLifeTime ?? new TimeSpan(0, 5, 0)); } return(result); }
public async Task <TReturnOfNextStep> CompleteWith <TReturnOfNextStep, TFinalStepProvider>() where TFinalStepProvider : ISyncStepProvider <TContext, TReturn?, TReturnOfNextStep> { var finalStep = FinalElement <TContext, TReturn, TReturnOfNextStep> .Create( Context, PreviousElements.Append(this), Context.ServiceProvider.GetRequiredService <TFinalStepProvider>()); return(await finalStep.CompletePipeAsync()); }