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);
}
}
}