<PackageReference Include="Polly.Core" Version="8.0.0-alpha.1" />

CircuitBreakerResilienceStrategyBuilderExtensions

Circuit breaker strategy extensions for ResilienceStrategyBuilder.
using Polly.CircuitBreaker; using Polly.CircuitBreaker.Health; using Polly.Utils; using System.Runtime.CompilerServices; namespace Polly { [System.Runtime.CompilerServices.NullableContext(1)] [System.Runtime.CompilerServices.Nullable(0)] public static class CircuitBreakerResilienceStrategyBuilderExtensions { public static ResilienceStrategyBuilder AddAdvancedCircuitBreaker(this ResilienceStrategyBuilder builder, AdvancedCircuitBreakerStrategyOptions options) { Guard.NotNull(builder, "builder"); Guard.NotNull(options, "options"); return builder.AddAdvancedCircuitBreakerCore(options); } public static ResilienceStrategyBuilder<TResult> AddAdvancedCircuitBreaker<[System.Runtime.CompilerServices.Nullable(2)] TResult>(this ResilienceStrategyBuilder<TResult> builder, AdvancedCircuitBreakerStrategyOptions<TResult> options) { Guard.NotNull(builder, "builder"); Guard.NotNull(options, "options"); return builder.AddAdvancedCircuitBreakerCore(options); } public static ResilienceStrategyBuilder<TResult> AddSimpleCircuitBreaker<[System.Runtime.CompilerServices.Nullable(2)] TResult>(this ResilienceStrategyBuilder<TResult> builder, SimpleCircuitBreakerStrategyOptions<TResult> options) { Guard.NotNull(builder, "builder"); Guard.NotNull(options, "options"); return builder.AddSimpleCircuitBreakerCore(options); } public static ResilienceStrategyBuilder AddSimpleCircuitBreaker(this ResilienceStrategyBuilder builder, SimpleCircuitBreakerStrategyOptions options) { Guard.NotNull(builder, "builder"); Guard.NotNull(options, "options"); return builder.AddSimpleCircuitBreakerCore(options); } private static TBuilder AddAdvancedCircuitBreakerCore<[System.Runtime.CompilerServices.Nullable(0)] TBuilder, [System.Runtime.CompilerServices.Nullable(2)] TResult>(this TBuilder builder, AdvancedCircuitBreakerStrategyOptions<TResult> options) where TBuilder : ResilienceStrategyBuilderBase { ValidationHelper.ValidateObject(options, "The advanced circuit breaker strategy options are invalid."); builder.AddStrategy(delegate(ResilienceStrategyBuilderContext context) { AdvancedCircuitBehavior behavior = new AdvancedCircuitBehavior(options.FailureThreshold, options.MinimumThroughput, HealthMetrics.Create(options.SamplingDuration, context.TimeProvider)); return CircuitBreakerResilienceStrategyBuilderExtensions.CreateStrategy<TResult>(context, (CircuitBreakerStrategyOptions<TResult>)options, (CircuitBehavior)behavior); }, options); return builder; } private static TBuilder AddSimpleCircuitBreakerCore<[System.Runtime.CompilerServices.Nullable(0)] TBuilder, [System.Runtime.CompilerServices.Nullable(2)] TResult>(this TBuilder builder, SimpleCircuitBreakerStrategyOptions<TResult> options) where TBuilder : ResilienceStrategyBuilderBase { ValidationHelper.ValidateObject(options, "The circuit breaker strategy options are invalid."); builder.AddStrategy((ResilienceStrategyBuilderContext context) => CircuitBreakerResilienceStrategyBuilderExtensions.CreateStrategy<TResult>(context, (CircuitBreakerStrategyOptions<TResult>)options, (CircuitBehavior)new ConsecutiveFailuresCircuitBehavior(options.FailureThreshold)), options); return builder; } internal static CircuitBreakerResilienceStrategy CreateStrategy<[System.Runtime.CompilerServices.Nullable(2)] TResult>(ResilienceStrategyBuilderContext context, CircuitBreakerStrategyOptions<TResult> options, CircuitBehavior behavior) { CircuitStateController controller = new CircuitStateController(options.BreakDuration, context.CreateInvoker(options.OnOpened), context.CreateInvoker(options.OnClosed), options.OnHalfOpened, behavior, context.TimeProvider, context.Telemetry); return new CircuitBreakerResilienceStrategy(context.CreateInvoker(options.ShouldHandle), controller, options.StateProvider, options.ManualControl); } } }