public IPipeElement <TContext, TReturn, TReturnOfNextStep> DoNext <TReturnOfNextStep, TStepProvider>()
 {
     return(Element <TContext, TReturn, TReturnOfNextStep> .Create(
                Context,
                PreviousElements.Append(this),
                Context.ServiceProvider.GetRequiredService <TStepProvider>()));
 }
Пример #2
0
        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());
        }