< Summary

Information
Class: Elsa.Resilience.Features.ResilienceFeature
Assembly: Elsa.Resilience
File(s): /home/runner/work/elsa-core/elsa-core/src/modules/Elsa.Resilience/Features/ResilienceFeature.cs
Line coverage
83%
Covered lines: 40
Uncovered lines: 8
Coverable lines: 48
Total lines: 105
Line coverage: 83.3%
Branch coverage
0%
Covered branches: 0
Total branches: 4
Branch coverage: 0%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

File(s)

/home/runner/work/elsa-core/elsa-core/src/modules/Elsa.Resilience/Features/ResilienceFeature.cs

#LineLine coverage
 1using Elsa.Expressions.Options;
 2using Elsa.Extensions;
 3using Elsa.Features.Abstractions;
 4using Elsa.Features.Services;
 5using Elsa.Resilience.Endpoints.SimulateResponse;
 6using Elsa.Resilience.Entities;
 7using Elsa.Resilience.Modifiers;
 8using Elsa.Resilience.Options;
 9using Elsa.Resilience.Recorders;
 10using Elsa.Resilience.Serialization;
 11using Elsa.Resilience.StrategySources;
 12using Elsa.Workflows;
 13using Elsa.Workflows.Options;
 14using Microsoft.Extensions.DependencyInjection;
 15using Microsoft.Extensions.DependencyInjection.Extensions;
 16using Elsa.Common.Serialization;
 17
 18namespace Elsa.Resilience.Features;
 19
 420public class ResilienceFeature(IModule module) : FeatureBase(module)
 21{
 422    private Func<IServiceProvider, IRetryAttemptRecorder> _retryAttemptRecorder = sp => sp.GetRequiredService<ActivityEx
 723    private Func<IServiceProvider, IRetryAttemptReader> _retryAttemptReader = sp => sp.GetRequiredService<ActivityExecut
 24
 25    public ResilienceFeature AddResilienceStrategyType<T>() where T : IResilienceStrategy
 26    {
 427        return AddResilienceStrategyType(typeof(T));
 28    }
 29
 30    public ResilienceFeature AddResilienceStrategyType(Type strategyType)
 31    {
 532        Services.Configure<ResilienceOptions>(options => options.StrategyTypes.Add(strategyType));
 433        return this;
 34    }
 35
 36    public ResilienceFeature WithActivityExecutionContextRetryAttemptRecorder()
 37    {
 038        return WithRetryAttemptRecorder<ActivityExecutionContextRetryAttemptRecorder>()
 039            .WithRetryAttemptReader<ActivityExecutionContextRetryAttemptReader>();
 40    }
 41
 42    public ResilienceFeature WithVoidRetryAttemptRecorder()
 43    {
 044        return WithRetryAttemptRecorder<VoidRetryAttemptRecorder>()
 045            .WithRetryAttemptReader<VoidRetryAttemptReader>();
 46    }
 47
 048    public ResilienceFeature WithRetryAttemptRecorder<T>() => WithRetryAttemptRecorder(sp => (IRetryAttemptRecorder)Acti
 049    public ResilienceFeature WithRetryAttemptReader<T>() => WithRetryAttemptReader(sp => (IRetryAttemptReader)ActivatorU
 50
 51    public ResilienceFeature WithRetryAttemptRecorder(Func<IServiceProvider, IRetryAttemptRecorder> recorder)
 52    {
 153        _retryAttemptRecorder = recorder;
 154        return this;
 55    }
 56
 57    public ResilienceFeature WithRetryAttemptReader(Func<IServiceProvider, IRetryAttemptReader> reader)
 58    {
 059        _retryAttemptReader = reader;
 060        return this;
 61    }
 62
 63    public override void Configure()
 64    {
 465        Module.AddFastEndpointsAssembly<ResilienceFeature>();
 66
 467        Services.Configure<ExpressionOptions>(options =>
 468        {
 469            options.AddTypeAlias<List<RetryAttemptRecord>>("RetryAttemptRecordList");
 870        });
 71
 472        Services.Configure<SerializationTypeOptions>(options =>
 473        {
 474            options.RegisterTypeAlias(typeof(List<RetryAttemptRecord>), "RetryAttemptRecordList");
 875        });
 476    }
 77
 78    public override void Apply()
 79    {
 480        Services.AddOptions<ResilienceOptions>();
 481        Services.AddOptions<SimulateResponseOptions>();
 482        Services.TryAddSingleton(TimeProvider.System);
 83
 484        Services
 485            .AddSingleton<ResilienceStrategySerializer>()
 486            .AddSingleton<SimulateResponseSessionStore>()
 487            .AddSingleton<IActivityDescriptorModifier, ResilientActivityDescriptorModifier>()
 488            .AddScoped<IResilienceStrategyCatalog, ResilienceStrategyCatalog>()
 489            .AddScoped<IResilienceStrategyConfigEvaluator, ResilienceStrategyConfigEvaluator>()
 490            .AddScoped<IResilientActivityInvoker, ResilientActivityInvoker>()
 491            .AddScoped<IResilienceStrategySource, ConfigurationResilienceStrategySource>()
 492            .AddSingleton(VoidRetryAttemptRecorder.Instance)
 493            .AddSingleton(VoidRetryAttemptReader.Instance)
 494            .AddScoped<ActivityExecutionContextRetryAttemptRecorder>()
 495            .AddScoped<ActivityExecutionContextRetryAttemptReader>()
 496            .AddScoped(_retryAttemptRecorder)
 497            .AddScoped(_retryAttemptReader)
 498            .AddHandlersFrom<ResilienceFeature>();
 99
 100        // Register transient exception detection infrastructure
 4101        Services
 4102            .AddSingleton<ITransientExceptionStrategy, DefaultTransientExceptionStrategy>()
 4103            .AddSingleton<ITransientExceptionDetector, TransientExceptionDetector>();
 4104    }
 105}