< 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
80%
Covered lines: 33
Uncovered lines: 8
Coverable lines: 41
Total lines: 93
Line coverage: 80.4%
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.Entities;
 6using Elsa.Resilience.Modifiers;
 7using Elsa.Resilience.Options;
 8using Elsa.Resilience.Recorders;
 9using Elsa.Resilience.Serialization;
 10using Elsa.Resilience.StrategySources;
 11using Elsa.Workflows;
 12using Microsoft.Extensions.DependencyInjection;
 13
 14namespace Elsa.Resilience.Features;
 15
 816public class ResilienceFeature(IModule module) : FeatureBase(module)
 17{
 818    private Func<IServiceProvider, IRetryAttemptRecorder> _retryAttemptRecorder = sp => sp.GetRequiredService<ActivityEx
 1519    private Func<IServiceProvider, IRetryAttemptReader> _retryAttemptReader = sp => sp.GetRequiredService<ActivityExecut
 20
 21    public ResilienceFeature AddResilienceStrategyType<T>() where T : IResilienceStrategy
 22    {
 823        return AddResilienceStrategyType(typeof(T));
 24    }
 25
 26    public ResilienceFeature AddResilienceStrategyType(Type strategyType)
 27    {
 928        Services.Configure<ResilienceOptions>(options => options.StrategyTypes.Add(strategyType));
 829        return this;
 30    }
 31
 32    public ResilienceFeature WithActivityExecutionContextRetryAttemptRecorder()
 33    {
 034        return WithRetryAttemptRecorder<ActivityExecutionContextRetryAttemptRecorder>()
 035            .WithRetryAttemptReader<ActivityExecutionContextRetryAttemptReader>();
 36    }
 37
 38    public ResilienceFeature WithVoidRetryAttemptRecorder()
 39    {
 040        return WithRetryAttemptRecorder<VoidRetryAttemptRecorder>()
 041            .WithRetryAttemptReader<VoidRetryAttemptReader>();
 42    }
 43
 044    public ResilienceFeature WithRetryAttemptRecorder<T>() => WithRetryAttemptRecorder(sp => (IRetryAttemptRecorder)Acti
 045    public ResilienceFeature WithRetryAttemptReader<T>() => WithRetryAttemptReader(sp => (IRetryAttemptReader)ActivatorU
 46
 47    public ResilienceFeature WithRetryAttemptRecorder(Func<IServiceProvider, IRetryAttemptRecorder> recorder)
 48    {
 149        _retryAttemptRecorder = recorder;
 150        return this;
 51    }
 52
 53    public ResilienceFeature WithRetryAttemptReader(Func<IServiceProvider, IRetryAttemptReader> reader)
 54    {
 055        _retryAttemptReader = reader;
 056        return this;
 57    }
 58
 59    public override void Configure()
 60    {
 861        Module.AddFastEndpointsAssembly<ResilienceFeature>();
 62
 863        Services.Configure<ExpressionOptions>(options =>
 864        {
 865            options.AddTypeAlias<List<RetryAttemptRecord>>("RetryAttemptRecordList");
 1666        });
 867    }
 68
 69    public override void Apply()
 70    {
 871        Services.AddOptions<ResilienceOptions>();
 72
 873        Services
 874            .AddSingleton<ResilienceStrategySerializer>()
 875            .AddSingleton<IActivityDescriptorModifier, ResilientActivityDescriptorModifier>()
 876            .AddScoped<IResilienceStrategyCatalog, ResilienceStrategyCatalog>()
 877            .AddScoped<IResilienceStrategyConfigEvaluator, ResilienceStrategyConfigEvaluator>()
 878            .AddScoped<IResilientActivityInvoker, ResilientActivityInvoker>()
 879            .AddScoped<IResilienceStrategySource, ConfigurationResilienceStrategySource>()
 880            .AddSingleton(VoidRetryAttemptRecorder.Instance)
 881            .AddSingleton(VoidRetryAttemptReader.Instance)
 882            .AddScoped<ActivityExecutionContextRetryAttemptRecorder>()
 883            .AddScoped<ActivityExecutionContextRetryAttemptReader>()
 884            .AddScoped(_retryAttemptRecorder)
 885            .AddScoped(_retryAttemptReader)
 886            .AddHandlersFrom<ResilienceFeature>();
 87
 88        // Register transient exception detection infrastructure
 889        Services
 890            .AddSingleton<ITransientExceptionStrategy, DefaultTransientExceptionStrategy>()
 891            .AddSingleton<ITransientExceptionDetector, TransientExceptionDetector>();
 892    }
 93}