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
{
return 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);
}
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
{
return builder.AddStrategy((ResilienceStrategyBuilderContext context) => CircuitBreakerResilienceStrategyBuilderExtensions.CreateStrategy<TResult>(context, (CircuitBreakerStrategyOptions<TResult>)options, (CircuitBehavior)new ConsecutiveFailuresCircuitBehavior(options.FailureThreshold)), options);
}
internal static CircuitBreakerResilienceStrategy<TResult> CreateStrategy<[System.Runtime.CompilerServices.Nullable(2)] TResult>(ResilienceStrategyBuilderContext context, CircuitBreakerStrategyOptions<TResult> options, CircuitBehavior behavior)
{
CircuitStateController<TResult> controller = new CircuitStateController<TResult>(options.BreakDuration, options.OnOpened, options.OnClosed, options.OnHalfOpened, behavior, context.TimeProvider, context.Telemetry);
return new CircuitBreakerResilienceStrategy<TResult>(options.ShouldHandle, controller, options.StateProvider, options.ManualControl, context.IsGenericBuilder);
}
}
}