diff --git a/bench/Polly.Core.Benchmarks/BridgeBenchmark.cs b/bench/Polly.Core.Benchmarks/BridgeBenchmark.cs index 21dad2d2428..473a0175168 100644 --- a/bench/Polly.Core.Benchmarks/BridgeBenchmark.cs +++ b/bench/Polly.Core.Benchmarks/BridgeBenchmark.cs @@ -9,12 +9,12 @@ public class BridgeBenchmark public void Setup() { _policy = Policy.NoOpAsync(); - _policyWrapped = NullResilienceStrategy.Instance.AsAsyncPolicy(); + _policyWrapped = NullResiliencePipeline.Instance.AsAsyncPolicy(); } [Benchmark(Baseline = true)] public Task NoOpAsync() => _policy!.ExecuteAsync(() => Task.FromResult("dummy")); [Benchmark] - public Task NullResilienceStrategy() => _policyWrapped!.ExecuteAsync(() => Task.FromResult("dummy")); + public Task NullResiliencePipeline() => _policyWrapped!.ExecuteAsync(() => Task.FromResult("dummy")); } diff --git a/bench/Polly.Core.Benchmarks/CircuitBreakerBenchmark.cs b/bench/Polly.Core.Benchmarks/CircuitBreakerBenchmark.cs index 9c4b2bb8348..39d86142d0a 100644 --- a/bench/Polly.Core.Benchmarks/CircuitBreakerBenchmark.cs +++ b/bench/Polly.Core.Benchmarks/CircuitBreakerBenchmark.cs @@ -2,19 +2,19 @@ namespace Polly.Core.Benchmarks; public class CircuitBreakerBenchmark { - private object? _strategyV7; - private object? _strategyV8; + private object? _circuitBreakerV7; + private object? _circuitBreakerV8; [GlobalSetup] public void Setup() { - _strategyV7 = Helper.CreateCircuitBreaker(PollyVersion.V7); - _strategyV8 = Helper.CreateCircuitBreaker(PollyVersion.V8); + _circuitBreakerV7 = Helper.CreateCircuitBreaker(PollyVersion.V7); + _circuitBreakerV8 = Helper.CreateCircuitBreaker(PollyVersion.V8); } [Benchmark(Baseline = true)] - public ValueTask ExecuteCircuitBreaker_V7() => _strategyV7!.ExecuteAsync(PollyVersion.V7); + public ValueTask ExecuteCircuitBreaker_V7() => _circuitBreakerV7!.ExecuteAsync(PollyVersion.V7); [Benchmark] - public ValueTask ExecuteCircuitBreaker_V8() => _strategyV8!.ExecuteAsync(PollyVersion.V8); + public ValueTask ExecuteCircuitBreaker_V8() => _circuitBreakerV8!.ExecuteAsync(PollyVersion.V8); } diff --git a/bench/Polly.Core.Benchmarks/CircuitBreakerOpenedBenchmark.cs b/bench/Polly.Core.Benchmarks/CircuitBreakerOpenedBenchmark.cs index 7f1de19bdfa..e6e91f0c4d7 100644 --- a/bench/Polly.Core.Benchmarks/CircuitBreakerOpenedBenchmark.cs +++ b/bench/Polly.Core.Benchmarks/CircuitBreakerOpenedBenchmark.cs @@ -2,15 +2,15 @@ namespace Polly.Core.Benchmarks; public class CircuitBreakerOpenedBenchmark { - private ResilienceStrategy? _strategy; - private ResilienceStrategy? _strategyHandlesOutcome; + private ResiliencePipeline? _pipeline; + private ResiliencePipeline? _reactivePipeline; private IAsyncPolicy? _policy; [GlobalSetup] public void Setup() { - _strategyHandlesOutcome = (ResilienceStrategy?)Helper.CreateOpenedCircuitBreaker(PollyVersion.V8, handleOutcome: true); - _strategy = (ResilienceStrategy?)Helper.CreateOpenedCircuitBreaker(PollyVersion.V8, handleOutcome: false); + _reactivePipeline = (ResiliencePipeline?)Helper.CreateOpenedCircuitBreaker(PollyVersion.V8, handleOutcome: true); + _pipeline = (ResiliencePipeline?)Helper.CreateOpenedCircuitBreaker(PollyVersion.V8, handleOutcome: false); _policy = (IAsyncPolicy?)Helper.CreateOpenedCircuitBreaker(PollyVersion.V7, handleOutcome: false); } @@ -32,7 +32,7 @@ public async ValueTask ExecuteAsync_Exception_V8() { try { - await _strategy!.ExecuteAsync(_ => new ValueTask("dummy"), CancellationToken.None).ConfigureAwait(false); + await _pipeline!.ExecuteAsync(_ => new ValueTask("dummy"), CancellationToken.None).ConfigureAwait(false); } catch (BrokenCircuitException) { @@ -43,6 +43,6 @@ public async ValueTask ExecuteAsync_Exception_V8() [Benchmark(Baseline = true)] public async ValueTask ExecuteAsync_Outcome_V8() { - await _strategyHandlesOutcome!.ExecuteAsync(_ => new ValueTask("dummy"), CancellationToken.None).ConfigureAwait(false); + await _reactivePipeline!.ExecuteAsync(_ => new ValueTask("dummy"), CancellationToken.None).ConfigureAwait(false); } } diff --git a/bench/Polly.Core.Benchmarks/CreationBenchmark.cs b/bench/Polly.Core.Benchmarks/CreationBenchmark.cs index 818a0091537..ac3e507b2bf 100644 --- a/bench/Polly.Core.Benchmarks/CreationBenchmark.cs +++ b/bench/Polly.Core.Benchmarks/CreationBenchmark.cs @@ -15,7 +15,7 @@ public static void Fallback_V7() [Benchmark] public static void Fallback_V8() { - new CompositeStrategyBuilder() + new ResiliencePipelineBuilder() .AddFallback(new() { FallbackAction = _ => Outcome.FromResultAsTask("fallback") diff --git a/bench/Polly.Core.Benchmarks/HedgingBenchmark.cs b/bench/Polly.Core.Benchmarks/HedgingBenchmark.cs index 5d65a28e69f..fa059414f12 100644 --- a/bench/Polly.Core.Benchmarks/HedgingBenchmark.cs +++ b/bench/Polly.Core.Benchmarks/HedgingBenchmark.cs @@ -2,23 +2,22 @@ namespace Polly.Core.Benchmarks; public class HedgingBenchmark { - private ResilienceStrategy? _strategy; + private ResiliencePipeline? _pipeline; [GlobalSetup] - public void Setup() => - _strategy = Helper.CreateHedging(); + public void Setup() => _pipeline = Helper.CreateHedging(); [Benchmark(Baseline = true)] public async ValueTask Hedging_Primary() - => await _strategy!.ExecuteAsync(static _ => new ValueTask("primary")).ConfigureAwait(false); + => await _pipeline!.ExecuteAsync(static _ => new ValueTask("primary")).ConfigureAwait(false); [Benchmark] public async ValueTask Hedging_Secondary() - => await _strategy!.ExecuteAsync(static _ => new ValueTask(Helper.Failure)).ConfigureAwait(false); + => await _pipeline!.ExecuteAsync(static _ => new ValueTask(Helper.Failure)).ConfigureAwait(false); [Benchmark] public async ValueTask Hedging_Primary_AsyncWork() - => await _strategy!.ExecuteAsync( + => await _pipeline!.ExecuteAsync( static async _ => { await Task.Yield(); @@ -27,7 +26,7 @@ public async ValueTask Hedging_Primary_AsyncWork() [Benchmark] public async ValueTask Hedging_Secondary_AsyncWork() - => await _strategy!.ExecuteAsync( + => await _pipeline!.ExecuteAsync( static async _ => { await Task.Yield(); diff --git a/bench/Polly.Core.Benchmarks/MultipleStrategiesBenchmark.cs b/bench/Polly.Core.Benchmarks/MultipleStrategiesBenchmark.cs index 6494fe08d88..f6dd20f8c14 100644 --- a/bench/Polly.Core.Benchmarks/MultipleStrategiesBenchmark.cs +++ b/bench/Polly.Core.Benchmarks/MultipleStrategiesBenchmark.cs @@ -5,19 +5,19 @@ namespace Polly.Core.Benchmarks; public class MultipleStrategiesBenchmark { private MeterListener? _meterListener; - private object? _strategyV7; - private object? _strategyV8; - private object? _strategyTelemetryV8; - private ResilienceStrategy? _nonGeneric; - private ResilienceStrategy? _nonGenericTelemetry; + private object? _pipelineV7; + private object? _pipelineV8; + private object? _pipelineTelemetryV8; + private ResiliencePipeline? _nonGeneric; + private ResiliencePipeline? _nonGenericTelemetry; [GlobalSetup] public void Setup() { _meterListener = MeteringUtil.ListenPollyMetrics(); - _strategyV7 = Helper.CreateStrategyPipeline(PollyVersion.V7, false); - _strategyV8 = Helper.CreateStrategyPipeline(PollyVersion.V8, false); - _strategyTelemetryV8 = Helper.CreateStrategyPipeline(PollyVersion.V8, true); + _pipelineV7 = Helper.CreateStrategyPipeline(PollyVersion.V7, false); + _pipelineV8 = Helper.CreateStrategyPipeline(PollyVersion.V8, false); + _pipelineTelemetryV8 = Helper.CreateStrategyPipeline(PollyVersion.V8, true); _nonGeneric = Helper.CreateNonGenericStrategyPipeline(telemetry: false); _nonGenericTelemetry = Helper.CreateNonGenericStrategyPipeline(telemetry: true); } @@ -26,13 +26,13 @@ public void Setup() public void Cleanup() => _meterListener?.Dispose(); [Benchmark(Baseline = true)] - public ValueTask ExecuteStrategyPipeline_Generic_V7() => _strategyV7!.ExecuteAsync(PollyVersion.V7); + public ValueTask ExecuteStrategyPipeline_Generic_V7() => _pipelineV7!.ExecuteAsync(PollyVersion.V7); [Benchmark] - public ValueTask ExecuteStrategyPipeline_Generic_V8() => _strategyV8!.ExecuteAsync(PollyVersion.V8); + public ValueTask ExecuteStrategyPipeline_Generic_V8() => _pipelineV8!.ExecuteAsync(PollyVersion.V8); [Benchmark] - public ValueTask ExecuteStrategyPipeline_GenericTelemetry_V8() => _strategyTelemetryV8!.ExecuteAsync(PollyVersion.V8); + public ValueTask ExecuteStrategyPipeline_GenericTelemetry_V8() => _pipelineTelemetryV8!.ExecuteAsync(PollyVersion.V8); [Benchmark] public async ValueTask ExecuteStrategyPipeline_NonGeneric_V8() diff --git a/bench/Polly.Core.Benchmarks/PipelineBenchmark.cs b/bench/Polly.Core.Benchmarks/PipelineBenchmark.cs index 3a643ccf25d..64b79457967 100644 --- a/bench/Polly.Core.Benchmarks/PipelineBenchmark.cs +++ b/bench/Polly.Core.Benchmarks/PipelineBenchmark.cs @@ -2,22 +2,22 @@ namespace Polly.Core.Benchmarks; public class PipelineBenchmark { - private object? _strategyV7; - private object? _strategyV8; + private object? _pipelineV7; + private object? _pipelineV8; [GlobalSetup] public void Setup() { - _strategyV7 = Helper.CreatePipeline(PollyVersion.V7, Components); - _strategyV8 = Helper.CreatePipeline(PollyVersion.V8, Components); + _pipelineV7 = Helper.CreatePipeline(PollyVersion.V7, Components); + _pipelineV8 = Helper.CreatePipeline(PollyVersion.V8, Components); } [Params(1, 2, 5, 10)] public int Components { get; set; } [Benchmark(Baseline = true)] - public ValueTask ExecutePipeline_V7() => _strategyV7!.ExecuteAsync(PollyVersion.V7); + public ValueTask ExecutePipeline_V7() => _pipelineV7!.ExecuteAsync(PollyVersion.V7); [Benchmark] - public ValueTask ExecutePipeline_V8() => _strategyV8!.ExecuteAsync(PollyVersion.V8); + public ValueTask ExecutePipeline_V8() => _pipelineV8!.ExecuteAsync(PollyVersion.V8); } diff --git a/bench/Polly.Core.Benchmarks/RateLimiterBenchmark.cs b/bench/Polly.Core.Benchmarks/RateLimiterBenchmark.cs index 6134ae8197d..58018614dea 100644 --- a/bench/Polly.Core.Benchmarks/RateLimiterBenchmark.cs +++ b/bench/Polly.Core.Benchmarks/RateLimiterBenchmark.cs @@ -2,19 +2,19 @@ namespace Polly.Core.Benchmarks; public class RateLimiterBenchmark { - private object? _strategyV7; - private object? _strategyV8; + private object? _rateLimiterV7; + private object? _rateLimiterV8; [GlobalSetup] public void Setup() { - _strategyV7 = Helper.CreateRateLimiter(PollyVersion.V7); - _strategyV8 = Helper.CreateRateLimiter(PollyVersion.V8); + _rateLimiterV7 = Helper.CreateRateLimiter(PollyVersion.V7); + _rateLimiterV8 = Helper.CreateRateLimiter(PollyVersion.V8); } [Benchmark(Baseline = true)] - public ValueTask ExecuteRateLimiter_V7() => _strategyV7!.ExecuteAsync(PollyVersion.V7); + public ValueTask ExecuteRateLimiter_V7() => _rateLimiterV7!.ExecuteAsync(PollyVersion.V7); [Benchmark] - public ValueTask ExecuteRateLimiter_V8() => _strategyV8!.ExecuteAsync(PollyVersion.V8); + public ValueTask ExecuteRateLimiter_V8() => _rateLimiterV8!.ExecuteAsync(PollyVersion.V8); } diff --git a/bench/Polly.Core.Benchmarks/ResilienceStrategyBenchmark.cs b/bench/Polly.Core.Benchmarks/ResiliencePipelineBenchmark.cs similarity index 78% rename from bench/Polly.Core.Benchmarks/ResilienceStrategyBenchmark.cs rename to bench/Polly.Core.Benchmarks/ResiliencePipelineBenchmark.cs index 7e01b8899a0..c3b67fd06ca 100644 --- a/bench/Polly.Core.Benchmarks/ResilienceStrategyBenchmark.cs +++ b/bench/Polly.Core.Benchmarks/ResiliencePipelineBenchmark.cs @@ -4,13 +4,13 @@ namespace Polly.Core.Benchmarks; #pragma warning disable CA1822 // Mark members as static -public class ResilienceStrategyBenchmark +public class ResiliencePipelineBenchmark { [Benchmark(Baseline = true)] public async ValueTask ExecuteOutcomeAsync() { var context = ResilienceContextPool.Shared.Get(); - await NullResilienceStrategy.Instance.ExecuteOutcomeAsync((_, _) => Outcome.FromResultAsTask("dummy"), context, "state").ConfigureAwait(false); + await NullResiliencePipeline.Instance.ExecuteOutcomeAsync((_, _) => Outcome.FromResultAsTask("dummy"), context, "state").ConfigureAwait(false); ResilienceContextPool.Shared.Return(context); } @@ -18,40 +18,40 @@ public async ValueTask ExecuteOutcomeAsync() public async ValueTask ExecuteAsync_ResilienceContextAndState() { var context = ResilienceContextPool.Shared.Get(); - await NullResilienceStrategy.Instance.ExecuteAsync((_, _) => new ValueTask("dummy"), context, "state").ConfigureAwait(false); + await NullResiliencePipeline.Instance.ExecuteAsync((_, _) => new ValueTask("dummy"), context, "state").ConfigureAwait(false); ResilienceContextPool.Shared.Return(context); } [Benchmark] public async ValueTask ExecuteAsync_CancellationToken() { - await NullResilienceStrategy.Instance.ExecuteAsync(_ => new ValueTask("dummy"), CancellationToken.None).ConfigureAwait(false); + await NullResiliencePipeline.Instance.ExecuteAsync(_ => new ValueTask("dummy"), CancellationToken.None).ConfigureAwait(false); } [Benchmark] public async ValueTask ExecuteAsync_GenericStrategy_CancellationToken() { - await NullResilienceStrategy.Instance.ExecuteAsync(_ => new ValueTask("dummy"), CancellationToken.None).ConfigureAwait(false); + await NullResiliencePipeline.Instance.ExecuteAsync(_ => new ValueTask("dummy"), CancellationToken.None).ConfigureAwait(false); } [Benchmark] public void Execute_ResilienceContextAndState() { var context = ResilienceContextPool.Shared.Get(); - NullResilienceStrategy.Instance.Execute((_, _) => "dummy", context, "state"); + NullResiliencePipeline.Instance.Execute((_, _) => "dummy", context, "state"); ResilienceContextPool.Shared.Return(context); } [Benchmark] public void Execute_CancellationToken() { - NullResilienceStrategy.Instance.Execute(_ => "dummy", CancellationToken.None); + NullResiliencePipeline.Instance.Execute(_ => "dummy", CancellationToken.None); } [Benchmark] public void Execute_GenericStrategy_CancellationToken() { - NullResilienceStrategy.Instance.Execute(_ => "dummy", CancellationToken.None); + NullResiliencePipeline.Instance.Execute(_ => "dummy", CancellationToken.None); } public class NonGenericStrategy diff --git a/bench/Polly.Core.Benchmarks/ResiliencePipelineProviderBenchmark.cs b/bench/Polly.Core.Benchmarks/ResiliencePipelineProviderBenchmark.cs new file mode 100644 index 00000000000..5ad0ab0ade9 --- /dev/null +++ b/bench/Polly.Core.Benchmarks/ResiliencePipelineProviderBenchmark.cs @@ -0,0 +1,24 @@ +using Microsoft.Extensions.DependencyInjection; + +namespace Polly.Core.Benchmarks; + +public class ResiliencePipelineProviderBenchmark +{ + private ResiliencePipelineProvider? _provider; + + [GlobalSetup] + public void Setup() + { + _provider = new ServiceCollection() + .AddResiliencePipeline("dummy", builder => builder.AddTimeout(new TimeoutStrategyOptions())) + .AddResiliencePipeline("dummy", builder => builder.AddTimeout(new TimeoutStrategyOptions())) + .BuildServiceProvider() + .GetRequiredService>(); + } + + [Benchmark] + public void GetPipeline_Ok() => _provider!.GetPipeline("dummy"); + + [Benchmark] + public void GetPipeline_Generic_Ok() => _provider!.GetPipeline("dummy"); +} diff --git a/bench/Polly.Core.Benchmarks/ResilienceStrategyProviderBenchmark.cs b/bench/Polly.Core.Benchmarks/ResilienceStrategyProviderBenchmark.cs deleted file mode 100644 index 52073e39182..00000000000 --- a/bench/Polly.Core.Benchmarks/ResilienceStrategyProviderBenchmark.cs +++ /dev/null @@ -1,24 +0,0 @@ -using Microsoft.Extensions.DependencyInjection; - -namespace Polly.Core.Benchmarks; - -public class ResilienceStrategyProviderBenchmark -{ - private ResilienceStrategyProvider? _provider; - - [GlobalSetup] - public void Setup() - { - _provider = new ServiceCollection() - .AddResilienceStrategy("dummy", builder => builder.AddTimeout(new TimeoutStrategyOptions())) - .AddResilienceStrategy("dummy", builder => builder.AddTimeout(new TimeoutStrategyOptions())) - .BuildServiceProvider() - .GetRequiredService>(); - } - - [Benchmark] - public void Get_Ok() => _provider!.GetStrategy("dummy"); - - [Benchmark] - public void Get_Generic_Ok() => _provider!.GetStrategy("dummy"); -} diff --git a/bench/Polly.Core.Benchmarks/RetryBenchmark.cs b/bench/Polly.Core.Benchmarks/RetryBenchmark.cs index 2cd223a35cc..536912971cd 100644 --- a/bench/Polly.Core.Benchmarks/RetryBenchmark.cs +++ b/bench/Polly.Core.Benchmarks/RetryBenchmark.cs @@ -2,19 +2,19 @@ namespace Polly.Core.Benchmarks; public class RetryBenchmark { - private object? _strategyV7; - private object? _strategyV8; + private object? _retryV7; + private object? _retryV8; [GlobalSetup] public void Setup() { - _strategyV7 = Helper.CreateRetry(PollyVersion.V7); - _strategyV8 = Helper.CreateRetry(PollyVersion.V8); + _retryV7 = Helper.CreateRetry(PollyVersion.V7); + _retryV8 = Helper.CreateRetry(PollyVersion.V8); } [Benchmark(Baseline = true)] - public ValueTask ExecuteRetry_V7() => _strategyV7!.ExecuteAsync(PollyVersion.V7); + public ValueTask ExecuteRetry_V7() => _retryV7!.ExecuteAsync(PollyVersion.V7); [Benchmark] - public ValueTask ExecuteRetry_V8() => _strategyV8!.ExecuteAsync(PollyVersion.V8); + public ValueTask ExecuteRetry_V8() => _retryV8!.ExecuteAsync(PollyVersion.V8); } diff --git a/bench/Polly.Core.Benchmarks/TelemetryBenchmark.cs b/bench/Polly.Core.Benchmarks/TelemetryBenchmark.cs index b98f59d91c1..daf8b0244a8 100644 --- a/bench/Polly.Core.Benchmarks/TelemetryBenchmark.cs +++ b/bench/Polly.Core.Benchmarks/TelemetryBenchmark.cs @@ -6,13 +6,13 @@ namespace Polly.Core.Benchmarks; public class TelemetryBenchmark { - private ResilienceStrategy? _strategy; + private ResiliencePipeline? _pipeline; private MeterListener? _meterListener; [GlobalSetup] public void Prepare() { - _strategy = Build(new CompositeStrategyBuilder()); + _pipeline = Build(new ResiliencePipelineBuilder()); if (Telemetry) { @@ -33,11 +33,11 @@ public void Prepare() public async ValueTask Execute() { var context = ResilienceContextPool.Shared.Get(); - await _strategy!.ExecuteOutcomeAsync((_, _) => Outcome.FromResultAsTask("dummy"), context, "state").ConfigureAwait(false); + await _pipeline!.ExecuteOutcomeAsync((_, _) => Outcome.FromResultAsTask("dummy"), context, "state").ConfigureAwait(false); ResilienceContextPool.Shared.Return(context); } - private ResilienceStrategy Build(CompositeStrategyBuilder builder) + private ResiliencePipeline Build(ResiliencePipelineBuilder builder) { builder.AddStrategy(context => new TelemetryEventStrategy(context.Telemetry), new EmptyResilienceOptions()); @@ -66,7 +66,7 @@ private ResilienceStrategy Build(CompositeStrategyBuilder builder) return builder.Build(); } - private class TelemetryEventStrategy : NonReactiveResilienceStrategy + private class TelemetryEventStrategy : ResilienceStrategy { private readonly ResilienceStrategyTelemetry _telemetry; diff --git a/bench/Polly.Core.Benchmarks/TimeoutBenchmark.cs b/bench/Polly.Core.Benchmarks/TimeoutBenchmark.cs index 331c8025562..617206c095a 100644 --- a/bench/Polly.Core.Benchmarks/TimeoutBenchmark.cs +++ b/bench/Polly.Core.Benchmarks/TimeoutBenchmark.cs @@ -2,19 +2,19 @@ namespace Polly.Core.Benchmarks; public class TimeoutBenchmark { - private object? _strategyV7; - private object? _strategyV8; + private object? _timeoutV7; + private object? _timeoutV8; [GlobalSetup] public void Setup() { - _strategyV7 = Helper.CreateTimeout(PollyVersion.V7); - _strategyV8 = Helper.CreateTimeout(PollyVersion.V8); + _timeoutV7 = Helper.CreateTimeout(PollyVersion.V7); + _timeoutV8 = Helper.CreateTimeout(PollyVersion.V8); } [Benchmark(Baseline = true)] - public ValueTask ExecuteTimeout_V7() => _strategyV7!.ExecuteAsync(PollyVersion.V7); + public ValueTask ExecuteTimeout_V7() => _timeoutV7!.ExecuteAsync(PollyVersion.V7); [Benchmark] - public ValueTask ExecuteTimeout_V8() => _strategyV8!.ExecuteAsync(PollyVersion.V8); + public ValueTask ExecuteTimeout_V8() => _timeoutV8!.ExecuteAsync(PollyVersion.V8); } diff --git a/bench/Polly.Core.Benchmarks/Utils/EmptyResilienceStrategy.cs b/bench/Polly.Core.Benchmarks/Utils/EmptyResilienceStrategy.cs index 3ae5f25b972..69c4c9df0ad 100644 --- a/bench/Polly.Core.Benchmarks/Utils/EmptyResilienceStrategy.cs +++ b/bench/Polly.Core.Benchmarks/Utils/EmptyResilienceStrategy.cs @@ -1,6 +1,6 @@ namespace Polly.Core.Benchmarks.Utils; -internal class EmptyResilienceStrategy : NonReactiveResilienceStrategy +internal class EmptyResilienceStrategy : ResilienceStrategy { protected override ValueTask> ExecuteCore( Func>> callback, diff --git a/bench/Polly.Core.Benchmarks/Utils/Helper.CircuitBreaker.cs b/bench/Polly.Core.Benchmarks/Utils/Helper.CircuitBreaker.cs index de6d0340caf..6a020c44aa7 100644 --- a/bench/Polly.Core.Benchmarks/Utils/Helper.CircuitBreaker.cs +++ b/bench/Polly.Core.Benchmarks/Utils/Helper.CircuitBreaker.cs @@ -13,7 +13,7 @@ public static object CreateOpenedCircuitBreaker(PollyVersion version, bool handl if (version == PollyVersion.V8) { - var builder = new CompositeStrategyBuilder(); + var builder = new ResiliencePipelineBuilder(); if (handleOutcome) { @@ -64,7 +64,7 @@ public static object CreateCircuitBreaker(PollyVersion technology) }; } - private class OutcomeHandlingStrategy : NonReactiveResilienceStrategy + private class OutcomeHandlingStrategy : ResilienceStrategy { protected override async ValueTask> ExecuteCore( Func>> callback, diff --git a/bench/Polly.Core.Benchmarks/Utils/Helper.Hedging.cs b/bench/Polly.Core.Benchmarks/Utils/Helper.Hedging.cs index ac44c060d75..94668d3fdac 100644 --- a/bench/Polly.Core.Benchmarks/Utils/Helper.Hedging.cs +++ b/bench/Polly.Core.Benchmarks/Utils/Helper.Hedging.cs @@ -6,7 +6,7 @@ internal static partial class Helper { public const string Failure = "failure"; - public static ResilienceStrategy CreateHedging() + public static ResiliencePipeline CreateHedging() { return CreateStrategy(builder => { diff --git a/bench/Polly.Core.Benchmarks/Utils/Helper.MultipleStrategies.cs b/bench/Polly.Core.Benchmarks/Utils/Helper.MultipleStrategies.cs index 1e9b2dcc813..eef08efd2d8 100644 --- a/bench/Polly.Core.Benchmarks/Utils/Helper.MultipleStrategies.cs +++ b/bench/Polly.Core.Benchmarks/Utils/Helper.MultipleStrategies.cs @@ -57,9 +57,9 @@ internal static partial class Helper _ => throw new NotSupportedException() }; - public static ResilienceStrategy CreateNonGenericStrategyPipeline(bool telemetry) + public static ResiliencePipeline CreateNonGenericStrategyPipeline(bool telemetry) { - var builder = new CompositeStrategyBuilder() + var builder = new ResiliencePipelineBuilder() .AddConcurrencyLimiter(new ConcurrencyLimiterOptions { QueueLimit = 10, diff --git a/bench/Polly.Core.Benchmarks/Utils/Helper.cs b/bench/Polly.Core.Benchmarks/Utils/Helper.cs index 1afa00f3861..f0acdc8f243 100644 --- a/bench/Polly.Core.Benchmarks/Utils/Helper.cs +++ b/bench/Polly.Core.Benchmarks/Utils/Helper.cs @@ -14,7 +14,7 @@ public static async ValueTask ExecuteAsync(this object obj, PollyVersion version case PollyVersion.V8: var context = ResilienceContextPool.Shared.Get(); - await ((ResilienceStrategy)obj).ExecuteOutcomeAsync( + await ((ResiliencePipeline)obj).ExecuteOutcomeAsync( static (_, _) => Outcome.FromResultAsTask("dummy"), context, string.Empty).ConfigureAwait(false); @@ -26,9 +26,9 @@ public static async ValueTask ExecuteAsync(this object obj, PollyVersion version throw new NotSupportedException(); } - private static ResilienceStrategy CreateStrategy(Action> configure) + private static ResiliencePipeline CreateStrategy(Action> configure) { - var builder = new CompositeStrategyBuilder(); + var builder = new ResiliencePipelineBuilder(); configure(builder); return builder.Build(); } diff --git a/src/Polly.Core/CircuitBreaker/CircuitBreakerCompositeStrategyBuilderExtensions.cs b/src/Polly.Core/CircuitBreaker/CircuitBreakerResiliencePipelineBuilderExtensions.cs similarity index 71% rename from src/Polly.Core/CircuitBreaker/CircuitBreakerCompositeStrategyBuilderExtensions.cs rename to src/Polly.Core/CircuitBreaker/CircuitBreakerResiliencePipelineBuilderExtensions.cs index 281e7845cd8..8a2c8f4ee90 100644 --- a/src/Polly.Core/CircuitBreaker/CircuitBreakerCompositeStrategyBuilderExtensions.cs +++ b/src/Polly.Core/CircuitBreaker/CircuitBreakerResiliencePipelineBuilderExtensions.cs @@ -6,20 +6,21 @@ namespace Polly; /// -/// Circuit breaker strategy extensions for . +/// Circuit breaker extensions for . /// -public static class CircuitBreakerCompositeStrategyBuilderExtensions +public static class CircuitBreakerResiliencePipelineBuilderExtensions { /// - /// Add circuit breaker strategy to the builder. + /// Adds circuit breaker to the builder. /// /// The builder instance. /// The options instance. - /// A builder with the circuit breaker strategy added. + /// A builder with the circuit breaker added. /// - /// See for more details about the circuit breaker strategy. + /// See for more details about the circuit breaker. /// - /// If you are discarding the strategy created by this call make sure to use and dispose the manual control instance when the strategy is no longer used. + /// If you are discarding the circuit breaker by this call make sure to use + /// and dispose the manual control instance when the circuit breaker is no longer used. /// /// /// Thrown when or is . @@ -29,7 +30,7 @@ public static class CircuitBreakerCompositeStrategyBuilderExtensions "IL2026:Members annotated with 'RequiresUnreferencedCodeAttribute' require dynamic access otherwise can break functionality when trimming application code", Justification = "All options members preserved.")] [DynamicDependency(DynamicallyAccessedMemberTypes.All, typeof(CircuitBreakerStrategyOptions))] - public static CompositeStrategyBuilder AddCircuitBreaker(this CompositeStrategyBuilder builder, CircuitBreakerStrategyOptions options) + public static ResiliencePipelineBuilder AddCircuitBreaker(this ResiliencePipelineBuilder builder, CircuitBreakerStrategyOptions options) { Guard.NotNull(builder); Guard.NotNull(options); @@ -38,16 +39,17 @@ public static CompositeStrategyBuilder AddCircuitBreaker(this CompositeStrategyB } /// - /// Add circuit breaker strategy to the builder. + /// Adds circuit breaker to the builder. /// - /// The type of result the circuit breaker strategy handles. + /// The type of result the circuit breaker handles. /// The builder instance. /// The options instance. - /// A builder with the circuit breaker strategy added. + /// A builder with the circuit breaker added. /// - /// See for more details about the circuit breaker strategy. + /// See for more details about the circuit breaker. /// - /// If you are discarding the strategy created by this call make sure to use and dispose the manual control instance when the strategy is no longer used. + /// If you are discarding the circuit breaker by this call make sure to use + /// and dispose the manual control instance when the circuit breaker is no longer used. /// /// /// Thrown when or is . @@ -56,8 +58,8 @@ public static CompositeStrategyBuilder AddCircuitBreaker(this CompositeStrategyB "Trimming", "IL2026:Members annotated with 'RequiresUnreferencedCodeAttribute' require dynamic access otherwise can break functionality when trimming application code", Justification = "All options members preserved.")] - public static CompositeStrategyBuilder AddCircuitBreaker<[DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.All)] TResult>( - this CompositeStrategyBuilder builder, + public static ResiliencePipelineBuilder AddCircuitBreaker<[DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.All)] TResult>( + this ResiliencePipelineBuilder builder, CircuitBreakerStrategyOptions options) { Guard.NotNull(builder); diff --git a/src/Polly.Core/CircuitBreaker/CircuitBreakerResilienceStrategy.cs b/src/Polly.Core/CircuitBreaker/CircuitBreakerResilienceStrategy.cs index f016667fdae..5ed65a6a8aa 100644 --- a/src/Polly.Core/CircuitBreaker/CircuitBreakerResilienceStrategy.cs +++ b/src/Polly.Core/CircuitBreaker/CircuitBreakerResilienceStrategy.cs @@ -1,6 +1,6 @@ namespace Polly.CircuitBreaker; -internal sealed class CircuitBreakerResilienceStrategy : ReactiveResilienceStrategy +internal sealed class CircuitBreakerResilienceStrategy : ResilienceStrategy { private readonly Func, ValueTask> _handler; private readonly CircuitStateController _controller; diff --git a/src/Polly.Core/CircuitBreaker/CircuitBreakerStateProvider.cs b/src/Polly.Core/CircuitBreaker/CircuitBreakerStateProvider.cs index 4ac17fbd4b3..90ff5567663 100644 --- a/src/Polly.Core/CircuitBreaker/CircuitBreakerStateProvider.cs +++ b/src/Polly.Core/CircuitBreaker/CircuitBreakerStateProvider.cs @@ -24,7 +24,7 @@ internal void Initialize(Func circuitStateProvider, Func /// /// The initialization happens when the circuit-breaker strategy is attached to this class. - /// This happens when the final strategy is created by the call. + /// This happens when the final strategy is created by the call. /// internal bool IsInitialized => _circuitStateProvider != null; diff --git a/src/Polly.Core/CompositeStrategyBuilder.cs b/src/Polly.Core/CompositeStrategyBuilder.cs deleted file mode 100644 index b7d394849f0..00000000000 --- a/src/Polly.Core/CompositeStrategyBuilder.cs +++ /dev/null @@ -1,21 +0,0 @@ -using System.ComponentModel.DataAnnotations; - -namespace Polly; - -/// -/// A builder that is used to create an instance of . -/// -/// -/// The builder supports combining multiple strategies into a composite resilience strategy. -/// The resulting instance of created by the call will execute the strategies in the same order they were added to the builder. -/// The order of the strategies is important. -/// -public sealed class CompositeStrategyBuilder : CompositeStrategyBuilderBase -{ - /// - /// Builds the resilience strategy. - /// - /// An instance of . - /// Thrown when this builder has invalid configuration. - public ResilienceStrategy Build() => BuildStrategy(); -} diff --git a/src/Polly.Core/Fallback/FallbackCompositeStrategyBuilderExtensions.cs b/src/Polly.Core/Fallback/FallbackResiliencePipelineBuilderExtensions.cs similarity index 79% rename from src/Polly.Core/Fallback/FallbackCompositeStrategyBuilderExtensions.cs rename to src/Polly.Core/Fallback/FallbackResiliencePipelineBuilderExtensions.cs index 9404b51467f..52092a03400 100644 --- a/src/Polly.Core/Fallback/FallbackCompositeStrategyBuilderExtensions.cs +++ b/src/Polly.Core/Fallback/FallbackResiliencePipelineBuilderExtensions.cs @@ -5,15 +5,15 @@ namespace Polly; /// -/// Provides extension methods for configuring fallback resilience strategies for . +/// Extensions for adding fallback to . /// -public static class FallbackCompositeStrategyBuilderExtensions +public static class FallbackResiliencePipelineBuilderExtensions { /// /// Adds a fallback resilience strategy with the provided options to the builder. /// /// The result type. - /// The resilience strategy builder. + /// The resilience pipeline builder. /// The options to configure the fallback resilience strategy. /// The builder instance with the fallback strategy added. /// Thrown when or is . @@ -22,8 +22,8 @@ public static class FallbackCompositeStrategyBuilderExtensions "Trimming", "IL2026:Members annotated with 'RequiresUnreferencedCodeAttribute' require dynamic access otherwise can break functionality when trimming application code", Justification = "All options members preserved.")] - public static CompositeStrategyBuilder AddFallback<[DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.All)] TResult>( - this CompositeStrategyBuilder builder, + public static ResiliencePipelineBuilder AddFallback<[DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.All)] TResult>( + this ResiliencePipelineBuilder builder, FallbackStrategyOptions options) { Guard.NotNull(builder); @@ -35,7 +35,7 @@ public static class FallbackCompositeStrategyBuilderExtensions /// /// Adds a fallback resilience strategy with the provided options to the builder. /// - /// The resilience strategy builder. + /// The resilience pipeline builder. /// The options to configure the fallback resilience strategy. /// The builder instance with the fallback strategy added. /// Thrown when or is . @@ -45,7 +45,7 @@ public static class FallbackCompositeStrategyBuilderExtensions "IL2026:Members annotated with 'RequiresUnreferencedCodeAttribute' require dynamic access otherwise can break functionality when trimming application code", Justification = "All options members preserved.")] [DynamicDependency(DynamicallyAccessedMemberTypes.All, typeof(FallbackStrategyOptions))] - internal static CompositeStrategyBuilder AddFallback(this CompositeStrategyBuilder builder, FallbackStrategyOptions options) + internal static ResiliencePipelineBuilder AddFallback(this ResiliencePipelineBuilder builder, FallbackStrategyOptions options) { Guard.NotNull(builder); Guard.NotNull(options); @@ -53,7 +53,7 @@ internal static CompositeStrategyBuilder AddFallback(this CompositeStrategyBuild return builder.AddStrategy(context => CreateFallback(context, options), options); } - private static ReactiveResilienceStrategy CreateFallback( + private static ResilienceStrategy CreateFallback( StrategyBuilderContext context, FallbackStrategyOptions options) { diff --git a/src/Polly.Core/Fallback/FallbackResilienceStrategy.cs b/src/Polly.Core/Fallback/FallbackResilienceStrategy.cs index d5a4a436737..c9d57081db3 100644 --- a/src/Polly.Core/Fallback/FallbackResilienceStrategy.cs +++ b/src/Polly.Core/Fallback/FallbackResilienceStrategy.cs @@ -4,7 +4,7 @@ namespace Polly.Fallback; #pragma warning disable CA1031 // Do not catch general exception types -internal sealed class FallbackResilienceStrategy : ReactiveResilienceStrategy +internal sealed class FallbackResilienceStrategy : ResilienceStrategy { private readonly FallbackHandler _handler; private readonly Func, ValueTask>? _onFallback; diff --git a/src/Polly.Core/Hedging/HedgingCompositeStrategyBuilderExtensions.cs b/src/Polly.Core/Hedging/HedgingResiliencePipelineBuilderExtensions.cs similarity index 73% rename from src/Polly.Core/Hedging/HedgingCompositeStrategyBuilderExtensions.cs rename to src/Polly.Core/Hedging/HedgingResiliencePipelineBuilderExtensions.cs index 179dfc63757..625a4391bf5 100644 --- a/src/Polly.Core/Hedging/HedgingCompositeStrategyBuilderExtensions.cs +++ b/src/Polly.Core/Hedging/HedgingResiliencePipelineBuilderExtensions.cs @@ -6,25 +6,25 @@ namespace Polly; /// -/// Provides extension methods for configuring hedging resilience strategies for . +/// Extensions for adding hedging to . /// -public static class HedgingCompositeStrategyBuilderExtensions +public static class HedgingResiliencePipelineBuilderExtensions { /// - /// Adds a hedging resilience strategy with the provided options to the builder. + /// Adds a hedging with the provided options to the builder. /// /// The result type. - /// The resilience strategy builder. - /// The options to configure the hedging resilience strategy. - /// The builder instance with the hedging strategy added. + /// The resilience pipeline builder. + /// The options to configure the hedging. + /// The builder instance with the hedging added. /// Thrown when or is . /// Thrown when are invalid. [UnconditionalSuppressMessage( "Trimming", "IL2026:Members annotated with 'RequiresUnreferencedCodeAttribute' require dynamic access otherwise can break functionality when trimming application code", Justification = "All options members preserved.")] - public static CompositeStrategyBuilder AddHedging<[DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.All)] TResult>( - this CompositeStrategyBuilder builder, + public static ResiliencePipelineBuilder AddHedging<[DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.All)] TResult>( + this ResiliencePipelineBuilder builder, HedgingStrategyOptions options) { Guard.NotNull(builder); @@ -34,11 +34,11 @@ public static class HedgingCompositeStrategyBuilderExtensions } /// - /// Adds a hedging resilience strategy with the provided options to the builder. + /// Adds a hedging with the provided options to the builder. /// - /// The resilience strategy builder. - /// The options to configure the hedging resilience strategy. - /// The builder instance with the hedging strategy added. + /// The resilience pipeline builder. + /// The options to configure the hedging. + /// The builder instance with the hedging added. /// Thrown when or is . /// Thrown when are invalid. [UnconditionalSuppressMessage( @@ -46,7 +46,7 @@ public static class HedgingCompositeStrategyBuilderExtensions "IL2026:Members annotated with 'RequiresUnreferencedCodeAttribute' require dynamic access otherwise can break functionality when trimming application code", Justification = "All options members preserved.")] [DynamicDependency(DynamicallyAccessedMemberTypes.All, typeof(HedgingStrategyOptions))] - internal static CompositeStrategyBuilder AddHedging(this CompositeStrategyBuilder builder, HedgingStrategyOptions options) + internal static ResiliencePipelineBuilder AddHedging(this ResiliencePipelineBuilder builder, HedgingStrategyOptions options) { Guard.NotNull(builder); Guard.NotNull(options); diff --git a/src/Polly.Core/Hedging/HedgingResilienceStrategy.cs b/src/Polly.Core/Hedging/HedgingResilienceStrategy.cs index b384d3ecb9d..d674e3dffc7 100644 --- a/src/Polly.Core/Hedging/HedgingResilienceStrategy.cs +++ b/src/Polly.Core/Hedging/HedgingResilienceStrategy.cs @@ -4,7 +4,7 @@ namespace Polly.Hedging; -internal sealed class HedgingResilienceStrategy : ReactiveResilienceStrategy +internal sealed class HedgingResilienceStrategy : ResilienceStrategy { private readonly TimeProvider _timeProvider; private readonly ResilienceStrategyTelemetry _telemetry; diff --git a/src/Polly.Core/NonReactiveResilienceStrategy.cs b/src/Polly.Core/NonReactiveResilienceStrategy.cs deleted file mode 100644 index 110a091d7fe..00000000000 --- a/src/Polly.Core/NonReactiveResilienceStrategy.cs +++ /dev/null @@ -1,36 +0,0 @@ -namespace Polly; - -/// -/// Base class for all non-reactive resilience strategies. -/// -public abstract class NonReactiveResilienceStrategy -{ - /// - /// An implementation of a non-reactive resilience strategy that executes the specified . - /// - /// The type of result returned by the callback. - /// The type of state associated with the callback. - /// The user-provided callback. - /// The context associated with the callback. - /// The state associated with the callback. - /// - /// An instance of a pending for asynchronous executions or a completed task for synchronous executions. - /// - /// - /// This method is called for both synchronous and asynchronous execution flows. - /// - /// You can use to determine whether is synchronous or asynchronous. - /// This is useful when the custom strategy behaves differently in each execution flow. In general, for most strategies, the implementation - /// is the same for both execution flows. - /// See for more details. - /// - /// - /// The provided callback never throws an exception. Instead, the exception is captured and converted to an . - /// Similarly, do not throw exceptions from your strategy implementation. Instead, return an exception instance as . - /// - /// - protected internal abstract ValueTask> ExecuteCore( - Func>> callback, - ResilienceContext context, - TState state); -} diff --git a/src/Polly.Core/NullResiliencePipeline.TResult.cs b/src/Polly.Core/NullResiliencePipeline.TResult.cs new file mode 100644 index 00000000000..a77c8e017dd --- /dev/null +++ b/src/Polly.Core/NullResiliencePipeline.TResult.cs @@ -0,0 +1,18 @@ +namespace Polly; + +/// +/// A resilience pipeline that executes an user-provided callback without any additional logic. +/// +/// The type of result this pipeline handles. +public sealed class NullResiliencePipeline : ResiliencePipeline +{ + /// + /// Gets the singleton instance of the . + /// + public static readonly NullResiliencePipeline Instance = new(); + + private NullResiliencePipeline() + : base(NullResiliencePipeline.Instance) + { + } +} diff --git a/src/Polly.Core/NullResilienceStrategy.cs b/src/Polly.Core/NullResiliencePipeline.cs similarity index 68% rename from src/Polly.Core/NullResilienceStrategy.cs rename to src/Polly.Core/NullResiliencePipeline.cs index 65e32bebe13..de66fbbe517 100644 --- a/src/Polly.Core/NullResilienceStrategy.cs +++ b/src/Polly.Core/NullResiliencePipeline.cs @@ -1,20 +1,19 @@ namespace Polly; /// -/// A resilience strategy that executes an user-provided callback without any additional logic. +/// A resilience pipeline that executes an user-provided callback without any additional logic. /// -public sealed class NullResilienceStrategy : ResilienceStrategy +public sealed class NullResiliencePipeline : ResiliencePipeline { /// - /// Gets the singleton instance of the . + /// Gets the singleton instance of the . /// - public static readonly NullResilienceStrategy Instance = new(); + public static readonly NullResiliencePipeline Instance = new(); - private NullResilienceStrategy() + private NullResiliencePipeline() { } - /// internal override ValueTask> ExecuteCore( Func>> callback, ResilienceContext context, diff --git a/src/Polly.Core/NullResilienceStrategy.TResult.cs b/src/Polly.Core/NullResilienceStrategy.TResult.cs deleted file mode 100644 index d82e0450b84..00000000000 --- a/src/Polly.Core/NullResilienceStrategy.TResult.cs +++ /dev/null @@ -1,18 +0,0 @@ -namespace Polly; - -/// -/// A resilience strategy that executes an user-provided callback without any additional logic. -/// -/// The type of result this strategy handles. -public sealed class NullResilienceStrategy : ResilienceStrategy -{ - /// - /// Gets the singleton instance of the . - /// - public static readonly NullResilienceStrategy Instance = new(); - - private NullResilienceStrategy() - : base(NullResilienceStrategy.Instance) - { - } -} diff --git a/src/Polly.Core/PublicAPI.Unshipped.txt b/src/Polly.Core/PublicAPI.Unshipped.txt index b150181940e..4c9f588d43e 100644 --- a/src/Polly.Core/PublicAPI.Unshipped.txt +++ b/src/Polly.Core/PublicAPI.Unshipped.txt @@ -1,12 +1,12 @@ -abstract Polly.NonReactiveResilienceStrategy.ExecuteCore(System.Func>>! callback, Polly.ResilienceContext! context, TState state) -> System.Threading.Tasks.ValueTask> -abstract Polly.ReactiveResilienceStrategy.ExecuteCore(System.Func>>! callback, Polly.ResilienceContext! context, TState state) -> System.Threading.Tasks.ValueTask> -abstract Polly.Registry.ResilienceStrategyProvider.TryGetStrategy(TKey key, out Polly.ResilienceStrategy? strategy) -> bool -abstract Polly.Registry.ResilienceStrategyProvider.TryGetStrategy(TKey key, out Polly.ResilienceStrategy? strategy) -> bool +abstract Polly.Registry.ResiliencePipelineProvider.TryGetPipeline(TKey key, out Polly.ResiliencePipeline? pipeline) -> bool +abstract Polly.Registry.ResiliencePipelineProvider.TryGetPipeline(TKey key, out Polly.ResiliencePipeline? pipeline) -> bool abstract Polly.ResilienceContextPool.Get(string? operationKey, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> Polly.ResilienceContext! abstract Polly.ResilienceContextPool.Return(Polly.ResilienceContext! context) -> void +abstract Polly.ResilienceStrategy.ExecuteCore(System.Func>>! callback, Polly.ResilienceContext! context, TState state) -> System.Threading.Tasks.ValueTask> +abstract Polly.ResilienceStrategy.ExecuteCore(System.Func>>! callback, Polly.ResilienceContext! context, TState state) -> System.Threading.Tasks.ValueTask> override Polly.Outcome.ToString() -> string! -override Polly.Registry.ResilienceStrategyRegistry.TryGetStrategy(TKey key, out Polly.ResilienceStrategy? strategy) -> bool -override Polly.Registry.ResilienceStrategyRegistry.TryGetStrategy(TKey key, out Polly.ResilienceStrategy? strategy) -> bool +override Polly.Registry.ResiliencePipelineRegistry.TryGetPipeline(TKey key, out Polly.ResiliencePipeline? pipeline) -> bool +override Polly.Registry.ResiliencePipelineRegistry.TryGetPipeline(TKey key, out Polly.ResiliencePipeline? pipeline) -> bool override Polly.ResiliencePropertyKey.Equals(object? obj) -> bool override Polly.ResiliencePropertyKey.GetHashCode() -> int override Polly.ResiliencePropertyKey.ToString() -> string! @@ -74,25 +74,7 @@ Polly.CircuitBreaker.OnCircuitOpenedArguments Polly.CircuitBreaker.OnCircuitOpenedArguments.BreakDuration.get -> System.TimeSpan Polly.CircuitBreaker.OnCircuitOpenedArguments.IsManual.get -> bool Polly.CircuitBreaker.OnCircuitOpenedArguments.OnCircuitOpenedArguments(System.TimeSpan breakDuration, bool isManual) -> void -Polly.CircuitBreakerCompositeStrategyBuilderExtensions -Polly.CompositeStrategyBuilder -Polly.CompositeStrategyBuilder.Build() -> Polly.ResilienceStrategy! -Polly.CompositeStrategyBuilder.CompositeStrategyBuilder() -> void -Polly.CompositeStrategyBuilder -Polly.CompositeStrategyBuilder.Build() -> Polly.ResilienceStrategy! -Polly.CompositeStrategyBuilder.CompositeStrategyBuilder() -> void -Polly.CompositeStrategyBuilderBase -Polly.CompositeStrategyBuilderBase.DiagnosticSource.get -> System.Diagnostics.DiagnosticSource? -Polly.CompositeStrategyBuilderBase.DiagnosticSource.set -> void -Polly.CompositeStrategyBuilderBase.InstanceName.get -> string? -Polly.CompositeStrategyBuilderBase.InstanceName.set -> void -Polly.CompositeStrategyBuilderBase.Name.get -> string? -Polly.CompositeStrategyBuilderBase.Name.set -> void -Polly.CompositeStrategyBuilderBase.Properties.get -> Polly.ResilienceProperties! -Polly.CompositeStrategyBuilderBase.Randomizer.get -> System.Func! -Polly.CompositeStrategyBuilderBase.Randomizer.set -> void -Polly.CompositeStrategyBuilderBase.Validator.get -> System.Action! -Polly.CompositeStrategyBuilderExtensions +Polly.CircuitBreakerResiliencePipelineBuilderExtensions Polly.ExecutionRejectedException Polly.ExecutionRejectedException.ExecutionRejectedException() -> void Polly.ExecutionRejectedException.ExecutionRejectedException(string! message) -> void @@ -109,7 +91,7 @@ Polly.Fallback.FallbackStrategyOptions.ShouldHandle.get -> System.Func< Polly.Fallback.FallbackStrategyOptions.ShouldHandle.set -> void Polly.Fallback.OnFallbackArguments Polly.Fallback.OnFallbackArguments.OnFallbackArguments() -> void -Polly.FallbackCompositeStrategyBuilderExtensions +Polly.FallbackResiliencePipelineBuilderExtensions Polly.Hedging.HedgingActionGeneratorArguments Polly.Hedging.HedgingActionGeneratorArguments.ActionContext.get -> Polly.ResilienceContext! Polly.Hedging.HedgingActionGeneratorArguments.AttemptNumber.get -> int @@ -143,12 +125,10 @@ Polly.Hedging.OnHedgingArguments.AttemptNumber.get -> int Polly.Hedging.OnHedgingArguments.Duration.get -> System.TimeSpan Polly.Hedging.OnHedgingArguments.HasOutcome.get -> bool Polly.Hedging.OnHedgingArguments.OnHedgingArguments(int attemptNumber, bool hasOutcome, System.TimeSpan duration) -> void -Polly.HedgingCompositeStrategyBuilderExtensions +Polly.HedgingResiliencePipelineBuilderExtensions Polly.LegacySupport -Polly.NonReactiveResilienceStrategy -Polly.NonReactiveResilienceStrategy.NonReactiveResilienceStrategy() -> void -Polly.NullResilienceStrategy -Polly.NullResilienceStrategy +Polly.NullResiliencePipeline +Polly.NullResiliencePipeline Polly.Outcome Polly.Outcome Polly.Outcome.EnsureSuccess() -> void @@ -179,44 +159,42 @@ Polly.PredicateBuilder.HandleResult(System.Func! predica Polly.PredicateBuilder.HandleResult(TResult result, System.Collections.Generic.IEqualityComparer? comparer = null) -> Polly.PredicateBuilder! Polly.PredicateBuilder.PredicateBuilder() -> void Polly.PredicateResult -Polly.ReactiveResilienceStrategy -Polly.ReactiveResilienceStrategy.ReactiveResilienceStrategy() -> void Polly.Registry.ConfigureBuilderContext Polly.Registry.ConfigureBuilderContext.BuilderInstanceName.get -> string? Polly.Registry.ConfigureBuilderContext.BuilderName.get -> string! Polly.Registry.ConfigureBuilderContext.EnableReloads(System.Func!>! tokenProducerFactory) -> void -Polly.Registry.ConfigureBuilderContext.StrategyKey.get -> TKey -Polly.Registry.ResilienceStrategyProvider -Polly.Registry.ResilienceStrategyProvider.ResilienceStrategyProvider() -> void -Polly.Registry.ResilienceStrategyRegistry -Polly.Registry.ResilienceStrategyRegistry.ClearStrategies() -> void -Polly.Registry.ResilienceStrategyRegistry.ClearStrategies() -> void -Polly.Registry.ResilienceStrategyRegistry.GetOrAddStrategy(TKey key, System.Action!>! configure) -> Polly.ResilienceStrategy! -Polly.Registry.ResilienceStrategyRegistry.GetOrAddStrategy(TKey key, System.Action! configure) -> Polly.ResilienceStrategy! -Polly.Registry.ResilienceStrategyRegistry.GetOrAddStrategy(TKey key, System.Action!, Polly.Registry.ConfigureBuilderContext!>! configure) -> Polly.ResilienceStrategy! -Polly.Registry.ResilienceStrategyRegistry.GetOrAddStrategy(TKey key, System.Action!>! configure) -> Polly.ResilienceStrategy! -Polly.Registry.ResilienceStrategyRegistry.RemoveBuilder(TKey key) -> bool -Polly.Registry.ResilienceStrategyRegistry.RemoveBuilder(TKey key) -> bool -Polly.Registry.ResilienceStrategyRegistry.RemoveStrategy(TKey key) -> bool -Polly.Registry.ResilienceStrategyRegistry.RemoveStrategy(TKey key) -> bool -Polly.Registry.ResilienceStrategyRegistry.ResilienceStrategyRegistry() -> void -Polly.Registry.ResilienceStrategyRegistry.ResilienceStrategyRegistry(Polly.Registry.ResilienceStrategyRegistryOptions! options) -> void -Polly.Registry.ResilienceStrategyRegistry.TryAddBuilder(TKey key, System.Action!>! configure) -> bool -Polly.Registry.ResilienceStrategyRegistry.TryAddBuilder(TKey key, System.Action!, Polly.Registry.ConfigureBuilderContext!>! configure) -> bool -Polly.Registry.ResilienceStrategyRegistry.TryAddStrategy(TKey key, Polly.ResilienceStrategy! strategy) -> bool -Polly.Registry.ResilienceStrategyRegistry.TryAddStrategy(TKey key, Polly.ResilienceStrategy! strategy) -> bool -Polly.Registry.ResilienceStrategyRegistryOptions -Polly.Registry.ResilienceStrategyRegistryOptions.BuilderComparer.get -> System.Collections.Generic.IEqualityComparer! -Polly.Registry.ResilienceStrategyRegistryOptions.BuilderComparer.set -> void -Polly.Registry.ResilienceStrategyRegistryOptions.BuilderFactory.get -> System.Func! -Polly.Registry.ResilienceStrategyRegistryOptions.BuilderFactory.set -> void -Polly.Registry.ResilienceStrategyRegistryOptions.BuilderNameFormatter.get -> System.Func! -Polly.Registry.ResilienceStrategyRegistryOptions.BuilderNameFormatter.set -> void -Polly.Registry.ResilienceStrategyRegistryOptions.InstanceNameFormatter.get -> System.Func? -Polly.Registry.ResilienceStrategyRegistryOptions.InstanceNameFormatter.set -> void -Polly.Registry.ResilienceStrategyRegistryOptions.ResilienceStrategyRegistryOptions() -> void -Polly.Registry.ResilienceStrategyRegistryOptions.StrategyComparer.get -> System.Collections.Generic.IEqualityComparer! -Polly.Registry.ResilienceStrategyRegistryOptions.StrategyComparer.set -> void +Polly.Registry.ConfigureBuilderContext.PipelineKey.get -> TKey +Polly.Registry.ResiliencePipelineProvider +Polly.Registry.ResiliencePipelineProvider.ResiliencePipelineProvider() -> void +Polly.Registry.ResiliencePipelineRegistry +Polly.Registry.ResiliencePipelineRegistry.ClearPipelines() -> void +Polly.Registry.ResiliencePipelineRegistry.ClearPipelines() -> void +Polly.Registry.ResiliencePipelineRegistry.GetOrAddPipeline(TKey key, System.Action!>! configure) -> Polly.ResiliencePipeline! +Polly.Registry.ResiliencePipelineRegistry.GetOrAddPipeline(TKey key, System.Action! configure) -> Polly.ResiliencePipeline! +Polly.Registry.ResiliencePipelineRegistry.GetOrAddPipeline(TKey key, System.Action!, Polly.Registry.ConfigureBuilderContext!>! configure) -> Polly.ResiliencePipeline! +Polly.Registry.ResiliencePipelineRegistry.GetOrAddPipeline(TKey key, System.Action!>! configure) -> Polly.ResiliencePipeline! +Polly.Registry.ResiliencePipelineRegistry.RemoveBuilder(TKey key) -> bool +Polly.Registry.ResiliencePipelineRegistry.RemoveBuilder(TKey key) -> bool +Polly.Registry.ResiliencePipelineRegistry.RemovePipeline(TKey key) -> bool +Polly.Registry.ResiliencePipelineRegistry.RemovePipeline(TKey key) -> bool +Polly.Registry.ResiliencePipelineRegistry.ResiliencePipelineRegistry() -> void +Polly.Registry.ResiliencePipelineRegistry.ResiliencePipelineRegistry(Polly.Registry.ResiliencePipelineRegistryOptions! options) -> void +Polly.Registry.ResiliencePipelineRegistry.TryAddBuilder(TKey key, System.Action!>! configure) -> bool +Polly.Registry.ResiliencePipelineRegistry.TryAddBuilder(TKey key, System.Action!, Polly.Registry.ConfigureBuilderContext!>! configure) -> bool +Polly.Registry.ResiliencePipelineRegistry.TryAddPipeline(TKey key, Polly.ResiliencePipeline! pipeline) -> bool +Polly.Registry.ResiliencePipelineRegistry.TryAddPipeline(TKey key, Polly.ResiliencePipeline! pipeline) -> bool +Polly.Registry.ResiliencePipelineRegistryOptions +Polly.Registry.ResiliencePipelineRegistryOptions.BuilderComparer.get -> System.Collections.Generic.IEqualityComparer! +Polly.Registry.ResiliencePipelineRegistryOptions.BuilderComparer.set -> void +Polly.Registry.ResiliencePipelineRegistryOptions.BuilderFactory.get -> System.Func! +Polly.Registry.ResiliencePipelineRegistryOptions.BuilderFactory.set -> void +Polly.Registry.ResiliencePipelineRegistryOptions.BuilderNameFormatter.get -> System.Func! +Polly.Registry.ResiliencePipelineRegistryOptions.BuilderNameFormatter.set -> void +Polly.Registry.ResiliencePipelineRegistryOptions.InstanceNameFormatter.get -> System.Func? +Polly.Registry.ResiliencePipelineRegistryOptions.InstanceNameFormatter.set -> void +Polly.Registry.ResiliencePipelineRegistryOptions.PipelineComparer.get -> System.Collections.Generic.IEqualityComparer! +Polly.Registry.ResiliencePipelineRegistryOptions.PipelineComparer.set -> void +Polly.Registry.ResiliencePipelineRegistryOptions.ResiliencePipelineRegistryOptions() -> void Polly.ResilienceContext Polly.ResilienceContext.CancellationToken.get -> System.Threading.CancellationToken Polly.ResilienceContext.ContinueOnCapturedContext.get -> bool @@ -230,6 +208,58 @@ Polly.ResilienceContext.ResultType.get -> System.Type! Polly.ResilienceContextPool Polly.ResilienceContextPool.Get(System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> Polly.ResilienceContext! Polly.ResilienceContextPool.ResilienceContextPool() -> void +Polly.ResiliencePipeline +Polly.ResiliencePipeline.Execute(System.Action! callback) -> void +Polly.ResiliencePipeline.Execute(System.Action! callback, Polly.ResilienceContext! context) -> void +Polly.ResiliencePipeline.Execute(System.Action! callback, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> void +Polly.ResiliencePipeline.Execute(System.Func! callback, Polly.ResilienceContext! context, TState state) -> TResult +Polly.ResiliencePipeline.Execute(System.Func! callback, TState state, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> TResult +Polly.ResiliencePipeline.Execute(System.Func! callback, TState state) -> TResult +Polly.ResiliencePipeline.Execute(System.Func! callback, Polly.ResilienceContext! context) -> TResult +Polly.ResiliencePipeline.Execute(System.Func! callback, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> TResult +Polly.ResiliencePipeline.Execute(System.Func! callback) -> TResult +Polly.ResiliencePipeline.Execute(System.Action! callback, Polly.ResilienceContext! context, TState state) -> void +Polly.ResiliencePipeline.Execute(System.Action! callback, TState state, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> void +Polly.ResiliencePipeline.Execute(System.Action! callback, TState state) -> void +Polly.ResiliencePipeline.ExecuteAsync(System.Func! callback, Polly.ResilienceContext! context) -> System.Threading.Tasks.ValueTask +Polly.ResiliencePipeline.ExecuteAsync(System.Func! callback, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.ValueTask +Polly.ResiliencePipeline.ExecuteAsync(System.Func>! callback, Polly.ResilienceContext! context, TState state) -> System.Threading.Tasks.ValueTask +Polly.ResiliencePipeline.ExecuteAsync(System.Func>! callback, TState state, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.ValueTask +Polly.ResiliencePipeline.ExecuteAsync(System.Func>! callback, Polly.ResilienceContext! context) -> System.Threading.Tasks.ValueTask +Polly.ResiliencePipeline.ExecuteAsync(System.Func>! callback, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.ValueTask +Polly.ResiliencePipeline.ExecuteAsync(System.Func! callback, Polly.ResilienceContext! context, TState state) -> System.Threading.Tasks.ValueTask +Polly.ResiliencePipeline.ExecuteAsync(System.Func! callback, TState state, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.ValueTask +Polly.ResiliencePipeline.ExecuteOutcomeAsync(System.Func>>! callback, Polly.ResilienceContext! context, TState state) -> System.Threading.Tasks.ValueTask> +Polly.ResiliencePipeline +Polly.ResiliencePipeline.Execute(System.Func! callback, Polly.ResilienceContext! context, TState state) -> TResult +Polly.ResiliencePipeline.Execute(System.Func! callback, TState state, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> TResult +Polly.ResiliencePipeline.Execute(System.Func! callback, TState state) -> TResult +Polly.ResiliencePipeline.Execute(System.Func! callback, Polly.ResilienceContext! context) -> TResult +Polly.ResiliencePipeline.Execute(System.Func! callback, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> TResult +Polly.ResiliencePipeline.Execute(System.Func! callback) -> TResult +Polly.ResiliencePipeline.ExecuteAsync(System.Func>! callback, Polly.ResilienceContext! context, TState state) -> System.Threading.Tasks.ValueTask +Polly.ResiliencePipeline.ExecuteAsync(System.Func>! callback, TState state, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.ValueTask +Polly.ResiliencePipeline.ExecuteAsync(System.Func>! callback, Polly.ResilienceContext! context) -> System.Threading.Tasks.ValueTask +Polly.ResiliencePipeline.ExecuteAsync(System.Func>! callback, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.ValueTask +Polly.ResiliencePipeline.ExecuteOutcomeAsync(System.Func>>! callback, Polly.ResilienceContext! context, TState state) -> System.Threading.Tasks.ValueTask> +Polly.ResiliencePipelineBuilder +Polly.ResiliencePipelineBuilder.Build() -> Polly.ResiliencePipeline! +Polly.ResiliencePipelineBuilder.ResiliencePipelineBuilder() -> void +Polly.ResiliencePipelineBuilder +Polly.ResiliencePipelineBuilder.Build() -> Polly.ResiliencePipeline! +Polly.ResiliencePipelineBuilder.ResiliencePipelineBuilder() -> void +Polly.ResiliencePipelineBuilderBase +Polly.ResiliencePipelineBuilderBase.DiagnosticSource.get -> System.Diagnostics.DiagnosticSource? +Polly.ResiliencePipelineBuilderBase.DiagnosticSource.set -> void +Polly.ResiliencePipelineBuilderBase.InstanceName.get -> string? +Polly.ResiliencePipelineBuilderBase.InstanceName.set -> void +Polly.ResiliencePipelineBuilderBase.Name.get -> string? +Polly.ResiliencePipelineBuilderBase.Name.set -> void +Polly.ResiliencePipelineBuilderBase.Properties.get -> Polly.ResilienceProperties! +Polly.ResiliencePipelineBuilderBase.Randomizer.get -> System.Func! +Polly.ResiliencePipelineBuilderBase.Randomizer.set -> void +Polly.ResiliencePipelineBuilderBase.Validator.get -> System.Action! +Polly.ResiliencePipelineBuilderExtensions Polly.ResilienceProperties Polly.ResilienceProperties.GetValue(Polly.ResiliencePropertyKey key, TValue defaultValue) -> TValue Polly.ResilienceProperties.ResilienceProperties() -> void @@ -241,39 +271,9 @@ Polly.ResiliencePropertyKey.Key.get -> string! Polly.ResiliencePropertyKey.ResiliencePropertyKey() -> void Polly.ResiliencePropertyKey.ResiliencePropertyKey(string! key) -> void Polly.ResilienceStrategy -Polly.ResilienceStrategy.Execute(System.Action! callback) -> void -Polly.ResilienceStrategy.Execute(System.Action! callback, Polly.ResilienceContext! context) -> void -Polly.ResilienceStrategy.Execute(System.Action! callback, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> void -Polly.ResilienceStrategy.Execute(System.Func! callback, Polly.ResilienceContext! context, TState state) -> TResult -Polly.ResilienceStrategy.Execute(System.Func! callback, TState state, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> TResult -Polly.ResilienceStrategy.Execute(System.Func! callback, TState state) -> TResult -Polly.ResilienceStrategy.Execute(System.Func! callback, Polly.ResilienceContext! context) -> TResult -Polly.ResilienceStrategy.Execute(System.Func! callback, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> TResult -Polly.ResilienceStrategy.Execute(System.Func! callback) -> TResult -Polly.ResilienceStrategy.Execute(System.Action! callback, Polly.ResilienceContext! context, TState state) -> void -Polly.ResilienceStrategy.Execute(System.Action! callback, TState state, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> void -Polly.ResilienceStrategy.Execute(System.Action! callback, TState state) -> void -Polly.ResilienceStrategy.ExecuteAsync(System.Func! callback, Polly.ResilienceContext! context) -> System.Threading.Tasks.ValueTask -Polly.ResilienceStrategy.ExecuteAsync(System.Func! callback, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.ValueTask -Polly.ResilienceStrategy.ExecuteAsync(System.Func>! callback, Polly.ResilienceContext! context, TState state) -> System.Threading.Tasks.ValueTask -Polly.ResilienceStrategy.ExecuteAsync(System.Func>! callback, TState state, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.ValueTask -Polly.ResilienceStrategy.ExecuteAsync(System.Func>! callback, Polly.ResilienceContext! context) -> System.Threading.Tasks.ValueTask -Polly.ResilienceStrategy.ExecuteAsync(System.Func>! callback, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.ValueTask -Polly.ResilienceStrategy.ExecuteAsync(System.Func! callback, Polly.ResilienceContext! context, TState state) -> System.Threading.Tasks.ValueTask -Polly.ResilienceStrategy.ExecuteAsync(System.Func! callback, TState state, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.ValueTask -Polly.ResilienceStrategy.ExecuteOutcomeAsync(System.Func>>! callback, Polly.ResilienceContext! context, TState state) -> System.Threading.Tasks.ValueTask> -Polly.ResilienceStrategy -Polly.ResilienceStrategy.Execute(System.Func! callback, Polly.ResilienceContext! context, TState state) -> TResult -Polly.ResilienceStrategy.Execute(System.Func! callback, TState state, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> TResult -Polly.ResilienceStrategy.Execute(System.Func! callback, TState state) -> TResult -Polly.ResilienceStrategy.Execute(System.Func! callback, Polly.ResilienceContext! context) -> TResult -Polly.ResilienceStrategy.Execute(System.Func! callback, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> TResult -Polly.ResilienceStrategy.Execute(System.Func! callback) -> TResult -Polly.ResilienceStrategy.ExecuteAsync(System.Func>! callback, Polly.ResilienceContext! context, TState state) -> System.Threading.Tasks.ValueTask -Polly.ResilienceStrategy.ExecuteAsync(System.Func>! callback, TState state, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.ValueTask -Polly.ResilienceStrategy.ExecuteAsync(System.Func>! callback, Polly.ResilienceContext! context) -> System.Threading.Tasks.ValueTask -Polly.ResilienceStrategy.ExecuteAsync(System.Func>! callback, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.ValueTask -Polly.ResilienceStrategy.ExecuteOutcomeAsync(System.Func>>! callback, Polly.ResilienceContext! context, TState state) -> System.Threading.Tasks.ValueTask> +Polly.ResilienceStrategy.ResilienceStrategy() -> void +Polly.ResilienceStrategy +Polly.ResilienceStrategy.ResilienceStrategy() -> void Polly.ResilienceStrategyOptions Polly.ResilienceStrategyOptions.Name.get -> string? Polly.ResilienceStrategyOptions.Name.set -> void @@ -318,7 +318,7 @@ Polly.Retry.RetryStrategyOptions.ShouldHandle.get -> System.Func.ShouldHandle.set -> void Polly.Retry.RetryStrategyOptions.UseJitter.get -> bool Polly.Retry.RetryStrategyOptions.UseJitter.set -> void -Polly.RetryCompositeStrategyBuilderExtensions +Polly.RetryResiliencePipelineBuilderExtensions Polly.StrategyBuilderContext Polly.StrategyBuilderContext.BuilderInstanceName.get -> string? Polly.StrategyBuilderContext.BuilderName.get -> string? @@ -352,10 +352,10 @@ Polly.Telemetry.ResilienceStrategyTelemetry.IsEnabled.get -> bool Polly.Telemetry.ResilienceStrategyTelemetry.Report(Polly.Telemetry.ResilienceEvent resilienceEvent, Polly.OutcomeArguments args) -> void Polly.Telemetry.ResilienceStrategyTelemetry.Report(Polly.Telemetry.ResilienceEvent resilienceEvent, Polly.ResilienceContext! context, TArgs args) -> void Polly.Telemetry.ResilienceTelemetrySource -Polly.Telemetry.ResilienceTelemetrySource.BuilderInstanceName.get -> string? -Polly.Telemetry.ResilienceTelemetrySource.BuilderName.get -> string? Polly.Telemetry.ResilienceTelemetrySource.BuilderProperties.get -> Polly.ResilienceProperties! -Polly.Telemetry.ResilienceTelemetrySource.ResilienceTelemetrySource(string? builderName, string? builderInstanceName, Polly.ResilienceProperties! builderProperties, string? strategyName) -> void +Polly.Telemetry.ResilienceTelemetrySource.PipelineInstanceName.get -> string? +Polly.Telemetry.ResilienceTelemetrySource.PipelineName.get -> string? +Polly.Telemetry.ResilienceTelemetrySource.ResilienceTelemetrySource(string? pipelineName, string? pipelineInstanceName, Polly.ResilienceProperties! builderProperties, string? strategyName) -> void Polly.Telemetry.ResilienceTelemetrySource.StrategyName.get -> string? Polly.Telemetry.TelemetryEventArguments Polly.Telemetry.TelemetryEventArguments.Arguments.get -> object! @@ -387,16 +387,11 @@ Polly.Timeout.TimeoutStrategyOptions.Timeout.set -> void Polly.Timeout.TimeoutStrategyOptions.TimeoutGenerator.get -> System.Func>? Polly.Timeout.TimeoutStrategyOptions.TimeoutGenerator.set -> void Polly.Timeout.TimeoutStrategyOptions.TimeoutStrategyOptions() -> void -Polly.TimeoutCompositeStrategyBuilderExtensions -static Polly.CircuitBreakerCompositeStrategyBuilderExtensions.AddCircuitBreaker(this Polly.CompositeStrategyBuilder! builder, Polly.CircuitBreaker.CircuitBreakerStrategyOptions! options) -> Polly.CompositeStrategyBuilder! -static Polly.CircuitBreakerCompositeStrategyBuilderExtensions.AddCircuitBreaker(this Polly.CompositeStrategyBuilder! builder, Polly.CircuitBreaker.CircuitBreakerStrategyOptions! options) -> Polly.CompositeStrategyBuilder! -static Polly.CompositeStrategyBuilderExtensions.AddStrategy(this Polly.CompositeStrategyBuilder! builder, System.Func!>! factory, Polly.ResilienceStrategyOptions! options) -> Polly.CompositeStrategyBuilder! -static Polly.CompositeStrategyBuilderExtensions.AddStrategy(this TBuilder! builder, Polly.ResilienceStrategy! strategy) -> TBuilder! -static Polly.CompositeStrategyBuilderExtensions.AddStrategy(this TBuilder! builder, System.Func! factory, Polly.ResilienceStrategyOptions! options) -> TBuilder! -static Polly.CompositeStrategyBuilderExtensions.AddStrategy(this Polly.CompositeStrategyBuilder! builder, Polly.ResilienceStrategy! strategy) -> Polly.CompositeStrategyBuilder! -static Polly.CompositeStrategyBuilderExtensions.AddStrategy(this Polly.CompositeStrategyBuilder! builder, System.Func!>! factory, Polly.ResilienceStrategyOptions! options) -> Polly.CompositeStrategyBuilder! -static Polly.FallbackCompositeStrategyBuilderExtensions.AddFallback(this Polly.CompositeStrategyBuilder! builder, Polly.Fallback.FallbackStrategyOptions! options) -> Polly.CompositeStrategyBuilder! -static Polly.HedgingCompositeStrategyBuilderExtensions.AddHedging(this Polly.CompositeStrategyBuilder! builder, Polly.Hedging.HedgingStrategyOptions! options) -> Polly.CompositeStrategyBuilder! +Polly.TimeoutResiliencePipelineBuilderExtensions +static Polly.CircuitBreakerResiliencePipelineBuilderExtensions.AddCircuitBreaker(this Polly.ResiliencePipelineBuilder! builder, Polly.CircuitBreaker.CircuitBreakerStrategyOptions! options) -> Polly.ResiliencePipelineBuilder! +static Polly.CircuitBreakerResiliencePipelineBuilderExtensions.AddCircuitBreaker(this Polly.ResiliencePipelineBuilder! builder, Polly.CircuitBreaker.CircuitBreakerStrategyOptions! options) -> Polly.ResiliencePipelineBuilder! +static Polly.FallbackResiliencePipelineBuilderExtensions.AddFallback(this Polly.ResiliencePipelineBuilder! builder, Polly.Fallback.FallbackStrategyOptions! options) -> Polly.ResiliencePipelineBuilder! +static Polly.HedgingResiliencePipelineBuilderExtensions.AddHedging(this Polly.ResiliencePipelineBuilder! builder, Polly.Hedging.HedgingStrategyOptions! options) -> Polly.ResiliencePipelineBuilder! static Polly.LegacySupport.SetProperties(this Polly.ResilienceProperties! resilienceProperties, System.Collections.Generic.IDictionary! properties, out System.Collections.Generic.IDictionary! oldProperties) -> void static Polly.Outcome.FromException(System.Exception! exception) -> Polly.Outcome static Polly.Outcome.FromExceptionAsTask(System.Exception! exception) -> System.Threading.Tasks.ValueTask> @@ -409,13 +404,18 @@ static Polly.PredicateBuilder.implicit operator System.Func System.Threading.Tasks.ValueTask static Polly.PredicateResult.True.get -> System.Threading.Tasks.ValueTask static Polly.ResilienceContextPool.Shared.get -> Polly.ResilienceContextPool! +static Polly.ResiliencePipelineBuilderExtensions.AddPipeline(this TBuilder! builder, Polly.ResiliencePipeline! pipeline) -> TBuilder! +static Polly.ResiliencePipelineBuilderExtensions.AddPipeline(this Polly.ResiliencePipelineBuilder! builder, Polly.ResiliencePipeline! pipeline) -> Polly.ResiliencePipelineBuilder! +static Polly.ResiliencePipelineBuilderExtensions.AddStrategy(this Polly.ResiliencePipelineBuilder! builder, System.Func!>! factory, Polly.ResilienceStrategyOptions! options) -> Polly.ResiliencePipelineBuilder! +static Polly.ResiliencePipelineBuilderExtensions.AddStrategy(this TBuilder! builder, System.Func! factory, Polly.ResilienceStrategyOptions! options) -> TBuilder! +static Polly.ResiliencePipelineBuilderExtensions.AddStrategy(this Polly.ResiliencePipelineBuilder! builder, System.Func!>! factory, Polly.ResilienceStrategyOptions! options) -> Polly.ResiliencePipelineBuilder! static Polly.ResiliencePropertyKey.operator !=(Polly.ResiliencePropertyKey left, Polly.ResiliencePropertyKey right) -> bool static Polly.ResiliencePropertyKey.operator ==(Polly.ResiliencePropertyKey left, Polly.ResiliencePropertyKey right) -> bool -static Polly.RetryCompositeStrategyBuilderExtensions.AddRetry(this Polly.CompositeStrategyBuilder! builder, Polly.Retry.RetryStrategyOptions! options) -> Polly.CompositeStrategyBuilder! -static Polly.RetryCompositeStrategyBuilderExtensions.AddRetry(this Polly.CompositeStrategyBuilder! builder, Polly.Retry.RetryStrategyOptions! options) -> Polly.CompositeStrategyBuilder! -static Polly.TimeoutCompositeStrategyBuilderExtensions.AddTimeout(this TBuilder! builder, Polly.Timeout.TimeoutStrategyOptions! options) -> TBuilder! -static Polly.TimeoutCompositeStrategyBuilderExtensions.AddTimeout(this TBuilder! builder, System.TimeSpan timeout) -> TBuilder! -static readonly Polly.NullResilienceStrategy.Instance -> Polly.NullResilienceStrategy! -static readonly Polly.NullResilienceStrategy.Instance -> Polly.NullResilienceStrategy! -virtual Polly.Registry.ResilienceStrategyProvider.GetStrategy(TKey key) -> Polly.ResilienceStrategy! -virtual Polly.Registry.ResilienceStrategyProvider.GetStrategy(TKey key) -> Polly.ResilienceStrategy! +static Polly.RetryResiliencePipelineBuilderExtensions.AddRetry(this Polly.ResiliencePipelineBuilder! builder, Polly.Retry.RetryStrategyOptions! options) -> Polly.ResiliencePipelineBuilder! +static Polly.RetryResiliencePipelineBuilderExtensions.AddRetry(this Polly.ResiliencePipelineBuilder! builder, Polly.Retry.RetryStrategyOptions! options) -> Polly.ResiliencePipelineBuilder! +static Polly.TimeoutResiliencePipelineBuilderExtensions.AddTimeout(this TBuilder! builder, Polly.Timeout.TimeoutStrategyOptions! options) -> TBuilder! +static Polly.TimeoutResiliencePipelineBuilderExtensions.AddTimeout(this TBuilder! builder, System.TimeSpan timeout) -> TBuilder! +static readonly Polly.NullResiliencePipeline.Instance -> Polly.NullResiliencePipeline! +static readonly Polly.NullResiliencePipeline.Instance -> Polly.NullResiliencePipeline! +virtual Polly.Registry.ResiliencePipelineProvider.GetPipeline(TKey key) -> Polly.ResiliencePipeline! +virtual Polly.Registry.ResiliencePipelineProvider.GetPipeline(TKey key) -> Polly.ResiliencePipeline! diff --git a/src/Polly.Core/README.md b/src/Polly.Core/README.md index b6e66db1767..1b8400d2ceb 100644 --- a/src/Polly.Core/README.md +++ b/src/Polly.Core/README.md @@ -4,7 +4,7 @@ The Polly V8 API exposes unified and non-allocating resilience API that is descr ## Core API -At the heart of Polly V8 is the [ResilienceStrategy](ResilienceStrategy.cs) class that is responsible for execution of user code. It's one class that handles all Polly V7 scenarios: +At the heart of Polly V8 is the [ResiliencePipeline](ResiliencePipeline.cs) class that is responsible for execution of user code. It's one class that handles all Polly V7 scenarios: - `ISyncPolicy` - `IAsyncPolicy` @@ -12,12 +12,8 @@ At the heart of Polly V8 is the [ResilienceStrategy](ResilienceStrategy.cs) clas - `IAsyncPolicy` ``` csharp -public abstract class ResilienceStrategy +public abstract class ResiliencePipeline { - // the main method that all the others call - protected virtual ValueTask> ExecuteCoreAsync(Func>> execution, ResilienceContext context, TState state); - - // convenience methods for various types of user-callbacks public void Execute(Action callback); public TResult Execute(Func callback); @@ -53,7 +49,7 @@ public sealed class ResilienceContext } ``` -The `ResilienceStrategy` unifies the 4 different policies used now in Polly. User actions are executed under a single API. The are many methods +The `ResiliencePipeline` unifies the 4 different policies used now in Polly. User actions are executed under a single API. The are many methods exposed on this class that cover different scenarios: - Synchronous void methods. @@ -73,7 +69,7 @@ public void Execute(Action execute) try { - strategy.ExecuteAsync(static (context, state) => + ExecuteCore(static (context, state) => { state(); return new ValueTask>(new(VoidResult.Instance)); @@ -96,7 +92,13 @@ In the preceding example: - We block the execution. - We return `ResilienceContext` to the pool. -Underlying implementation decides how to execute this user-callback by reading the `ResilienceContext`: + +The resilience pipeline is composed of a single or multiple individual resilience strategies. Polly V8 recognizes the following building blocks for resilience strategies: + +- `ResilienceStrategy`: Base class for all non-reactive resilience strategies. +- `ResilienceStrategy`: Base class for all reactive resilience strategies. + +For example we have non-reactive delay strategy that decides how to execute this user-callback by reading the `ResilienceContext`: ``` csharp internal class DelayStrategy : ResilienceStrategy @@ -122,7 +124,7 @@ internal class DelayStrategy : ResilienceStrategy In the preceding example we are calling the `DelayAsync` extension for `TimeProvider` that accepts the `ResilienceContext`. The extension is using `Thread.Sleep` for synchronous executions and `Task.Delay` for asynchronous executions. -This way, the responsibility of how to execute method is lifted from the user and instead passed to the policy. User cares only about the `ResilienceStrategy` class. User uses only a single strategy to execute all scenarios. Previously, user had to decide whether to use sync vs async, typed vs non-typed policies. +This way, the responsibility of how to execute method is lifted from the user and instead passed to the policy. User cares only about the `ResiliencePipeline` class. User uses only a single strategy to execute all scenarios. Previously, user had to decide whether to use sync vs async, typed vs non-typed policies. The life of extensibility author is also simplified as they only maintain one implementation of strategy instead of multiple ones. See the duplications in [`Polly.Retry`](https://github.com/App-vNext/Polly/tree/main/src/Polly/Retry). @@ -136,43 +138,43 @@ A common scenario that illustrates this is the circuit breaker, which allows for ### Generic Resilience Strategy -Polly also exposes the sealed `ResilienceStrategy` strategy that is just a simple wrapper over `ResilienceStrategy`. This strategy is used for scenarios when the consumer handles the single result type. +Polly also exposes the `ResiliencePipeline` that is just a simple wrapper over `ResiliencePipeline`. This pipeline is used for scenarios when the consumer handles the single result type. -## Creation of `ResilienceStrategy` +## Creation of `ResiliencePipeline` This API exposes the following builders: -- [CompositeStrategyBuilder](CompositeStrategyBuilder.cs): Used to create resilience strategies that can execute all types of callbacks. In general, these strategies only handle exceptions. -- [CompositeStrategyBuilder](CompositeStrategyBuilder.TResult.cs): Used to create generic resilience strategies that can only execute callbacks that return the same result type. -- [CompositeStrategyBuilderBase](CompositeStrategyBuilderBase.cs): The base class for both builders above. You can use it as a target for strategy extensions that work for both builders above. +- [ResiliencePipelineBuilder](ResiliencePipelineBuilder.cs): Used to create resilience strategies that can execute all types of callbacks. In general, these strategies only handle exceptions. +- [ResiliencePipelineBuilder](ResiliencePipelineBuilder.TResult.cs): Used to create generic resilience strategies that can only execute callbacks that return the same result type. +- [ResiliencePipelineBuilderBase](ResiliencePipelineBuilderBase.cs): The base class for both builders above. You can use it as a target for strategy extensions that work for both builders above. -To create a strategy or composite resilience strategy you chain various extensions for `CompositeStrategyBuilder` followed by the `Build` call: +To create a strategy or composite resilience strategy you chain various extensions for `ResiliencePipelineBuilder` followed by the `Build` call: -Single strategy: +Pipeline with a single strategy: ``` csharp -var resilienceStrategy = new CompositeStrategyBuilder().AddRetry().Build(); +var ResiliencePipeline = new ResiliencePipelineBuilder().AddRetry(new()).Build(); ``` -Composite strategy: +Pipeline wiht multiple strategies: ``` csharp -var resilienceStrategy = new CompositeStrategyBuilder() - .AddRetry() - .AddCircuitBreaker() +var ResiliencePipeline = new ResiliencePipelineBuilder() + .AddRetry(new()) + .AddCircuitBreaker(new()) .AddTimeout(new TimeoutStrategyOptions() { ... }) .Build(); ``` ## Extensibility -The resilience extensibility is simple. You just expose extensions for `CompositeStrategyBuilder` that use the `CompositeStrategyBuilder.AddStrategy` methods. +The resilience extensibility is simple. You just expose extensions for `ResiliencePipelineBuilder` that use the `ResiliencePipelineBuilder.AddStrategy` methods. -If you want to create a resilience strategy that works for both generic and non-generic builders you can use `CompositeStrategyBuilderBase` as a target: +If you want to create a resilience strategy that works for both generic and non-generic builders you can use `ResiliencePipelineBuilderBase` as a target: ``` csharp public static TBuilder AddMyStrategy(this TBuilder builder) - where TBuilder : CompositeStrategyBuilderBase + where TBuilder : ResiliencePipelineBuilderBase { return builder.AddStrategy(new MyStrategy()); } @@ -180,7 +182,7 @@ public static TBuilder AddMyStrategy(this TBuilder builder) # Resilience Strategy Delegates -Resilience strategies leverage the following delegate types: +Individual resilience strategies leverage the following delegate types: - **Predicates**: These are essential when a resilience strategy needs to determine whether or not to handle the execution result. - **Events**: These are invoked when significant events occur within the resilience strategy. @@ -219,7 +221,7 @@ Below are a few examples showcasing the usage of these delegates: A non-generic predicate defining retries for multiple result types: ``` csharp -new CompositeStrategyBuilder() +new ResiliencePipelineBuilder() .AddRetry(new RetryStrategyOptions { ShouldRetry = args => args switch @@ -236,7 +238,7 @@ new CompositeStrategyBuilder() A generic predicate defining retries for a single result type: ``` csharp -new CompositeStrategyBuilder() +new ResiliencePipelineBuilder() .AddRetry(new RetryStrategyOptions { ShouldRetry = args => args switch @@ -255,7 +257,7 @@ When setting the delegates, ensure to respect the `ResilienceContext.IsSynchrono ## Telemetry -Each individual resilience strategy can emit telemetry by using the [`ResilienceStrategyTelemetry`](Telemetry/ResilienceStrategyTelemetry.cs) API. Polly wraps the arguments as [`TelemetryEventArguments`](Telemetry/TelemetryEventArguments.cs) and emits them using `DiagnosticSource`. -To consume the telemetry, Polly adopters needs to assign an instance of `DiagnosticSource` to `CompositeStrategyBuilder.DiagnosticSource` and consume `TelemetryEventArguments`. +Each individual resilience strategy can emit telemetry by using the [`ResiliencePipelineTelemetry`](Telemetry/ResiliencePipelineTelemetry.cs) API. Polly wraps the arguments as [`TelemetryEventArguments`](Telemetry/TelemetryEventArguments.cs) and emits them using `DiagnosticSource`. +To consume the telemetry, Polly adopters needs to assign an instance of `DiagnosticSource` to `ResiliencePipelineBuilder.DiagnosticSource` and consume `TelemetryEventArguments`. -For common use-cases, it is anticipated that Polly users would leverage `Polly.Extensions`. This allows all of the aforementioned functionalities by invoking the `CompositeStrategyBuilder.ConfigureTelemetry(...)` extension method. `ConfigureTelemetry` processes `TelemetryEventArguments` and generates logs and metrics from it. +For common use-cases, it is anticipated that Polly users would leverage `Polly.Extensions`. This allows all of the aforementioned functionalities by invoking the `ResiliencePipelineBuilder.ConfigureTelemetry(...)` extension method. `ConfigureTelemetry` processes `TelemetryEventArguments` and generates logs and metrics from it. diff --git a/src/Polly.Core/Registry/ConfigureBuilderContext.cs b/src/Polly.Core/Registry/ConfigureBuilderContext.cs index 284e4edef14..323e65d0816 100644 --- a/src/Polly.Core/Registry/ConfigureBuilderContext.cs +++ b/src/Polly.Core/Registry/ConfigureBuilderContext.cs @@ -3,7 +3,7 @@ namespace Polly.Registry; /// -/// The context used by . +/// The context used by . /// /// The type of the key. public class ConfigureBuilderContext @@ -11,15 +11,15 @@ public class ConfigureBuilderContext { internal ConfigureBuilderContext(TKey strategyKey, string builderName, string? builderInstanceName) { - StrategyKey = strategyKey; + PipelineKey = strategyKey; BuilderName = builderName; BuilderInstanceName = builderInstanceName; } /// - /// Gets the strategy key for the strategy being created. + /// Gets the pipeline key for the pipeline being created. /// - public TKey StrategyKey { get; } + public TKey PipelineKey { get; } /// /// Gets the builder name for the builder being used to create the strategy. @@ -34,7 +34,7 @@ internal ConfigureBuilderContext(TKey strategyKey, string builderName, string? b internal Func>? ReloadTokenProducer { get; private set; } /// - /// Enables dynamic reloading of the strategy retrieved from . + /// Enables dynamic reloading of the strategy retrieved from . /// /// The producer of that is triggered when change occurs. /// diff --git a/src/Polly.Core/Registry/ResiliencePipelineProvider.cs b/src/Polly.Core/Registry/ResiliencePipelineProvider.cs new file mode 100644 index 00000000000..e6bdfb3679c --- /dev/null +++ b/src/Polly.Core/Registry/ResiliencePipelineProvider.cs @@ -0,0 +1,65 @@ +using System.Diagnostics.CodeAnalysis; + +namespace Polly.Registry; + +#pragma warning disable CA1716 // Identifiers should not match keywords + +/// +/// Represents a provider for resilience pipelines that are accessible by . +/// +/// The type of the key. +public abstract class ResiliencePipelineProvider + where TKey : notnull +{ + /// + /// Retrieves a resilience pipeline from the provider using the specified key. + /// + /// The key used to identify the resilience pipeline. + /// The resilience pipeline associated with the specified key. + /// Thrown when no resilience pipeline is found for the specified key. + public virtual ResiliencePipeline GetPipeline(TKey key) + { + if (TryGetPipeline(key, out var pipeline)) + { + return pipeline; + } + + throw new KeyNotFoundException($"Unable to find a resilience pipeline associated with the key '{key}'. " + + $"Please ensure that either the resilience pipeline or the builder is registered."); + } + + /// + /// Retrieves a generic resilience pipeline from the provider using the specified key. + /// + /// The type of result that the resilience pipeline handles. + /// The key used to identify the resilience pipeline. + /// The resilience pipeline associated with the specified key. + /// Thrown when no resilience pipeline is found for the specified key. + public virtual ResiliencePipeline GetPipeline(TKey key) + { + if (TryGetPipeline(key, out var pipeline)) + { + return pipeline; + } + + throw new KeyNotFoundException($"Unable to find a generic resilience pipeline of '{typeof(TResult).Name}' associated with the key '{key}'. " + + $"Please ensure that either the generic resilience pipeline or the generic builder is registered."); + } + + /// + /// Tries to get a resilience pipeline from the provider using the specified key. + /// + /// The key used to identify the resilience pipeline. + /// The output resilience pipeline if found, otherwise. + /// if the pipeline was found, otherwise. + public abstract bool TryGetPipeline(TKey key, [NotNullWhen(true)] out ResiliencePipeline? pipeline); + + /// + /// Tries to get a generic resilience pipeline from the provider using the specified key. + /// + /// The type of result that the resilience pipeline handles. + /// The key used to identify the resilience pipeline. + /// The output resilience pipeline if found, otherwise. + /// if the pipeline was found, otherwise. + public abstract bool TryGetPipeline(TKey key, [NotNullWhen(true)] out ResiliencePipeline? pipeline); +} diff --git a/src/Polly.Core/Registry/ResilienceStrategyRegistry.TResult.cs b/src/Polly.Core/Registry/ResiliencePipelineRegistry.TResult.cs similarity index 59% rename from src/Polly.Core/Registry/ResilienceStrategyRegistry.TResult.cs rename to src/Polly.Core/Registry/ResiliencePipelineRegistry.TResult.cs index e95d6b81f28..48c5ade2fa1 100644 --- a/src/Polly.Core/Registry/ResilienceStrategyRegistry.TResult.cs +++ b/src/Polly.Core/Registry/ResiliencePipelineRegistry.TResult.cs @@ -2,37 +2,37 @@ namespace Polly.Registry; -public sealed partial class ResilienceStrategyRegistry : ResilienceStrategyProvider +public sealed partial class ResiliencePipelineRegistry : ResiliencePipelineProvider where TKey : notnull { private sealed class GenericRegistry { - private readonly Func> _activator; - private readonly ConcurrentDictionary, ConfigureBuilderContext>> _builders; - private readonly ConcurrentDictionary> _strategies; + private readonly Func> _activator; + private readonly ConcurrentDictionary, ConfigureBuilderContext>> _builders; + private readonly ConcurrentDictionary> _strategies; private readonly Func _builderNameFormatter; private readonly Func? _instanceNameFormatter; public GenericRegistry( - Func> activator, + Func> activator, IEqualityComparer builderComparer, IEqualityComparer strategyComparer, Func builderNameFormatter, Func? instanceNameFormatter) { _activator = activator; - _builders = new ConcurrentDictionary, ConfigureBuilderContext>>(builderComparer); - _strategies = new ConcurrentDictionary>(strategyComparer); + _builders = new ConcurrentDictionary, ConfigureBuilderContext>>(builderComparer); + _strategies = new ConcurrentDictionary>(strategyComparer); _builderNameFormatter = builderNameFormatter; _instanceNameFormatter = instanceNameFormatter; } - public bool TryAdd(TKey key, ResilienceStrategy strategy) => _strategies.TryAdd(key, strategy); + public bool TryAdd(TKey key, ResiliencePipeline strategy) => _strategies.TryAdd(key, strategy); public bool Remove(TKey key) => _strategies.TryRemove(key, out _); - public bool TryGet(TKey key, [NotNullWhen(true)] out ResilienceStrategy? strategy) + public bool TryGet(TKey key, [NotNullWhen(true)] out ResiliencePipeline? strategy) { if (_strategies.TryGetValue(key, out strategy)) { @@ -49,22 +49,22 @@ public bool TryGet(TKey key, [NotNullWhen(true)] out ResilienceStrategy return false; } - public ResilienceStrategy GetOrAdd(TKey key, Action, ConfigureBuilderContext> configure) + public ResiliencePipeline GetOrAdd(TKey key, Action, ConfigureBuilderContext> configure) { var context = new ConfigureBuilderContext(key, _builderNameFormatter(key), _instanceNameFormatter?.Invoke(key)); #if NETCOREAPP3_0_OR_GREATER return _strategies.GetOrAdd(key, static (_, factory) => { - return new ResilienceStrategy(CreateStrategy(factory.instance._activator, factory.context, factory.configure)); + return new ResiliencePipeline(CreatePipeline(factory.instance._activator, factory.context, factory.configure)); }, (instance: this, context, configure)); #else - return _strategies.GetOrAdd(key, _ => new ResilienceStrategy(CreateStrategy(_activator, context, configure))); + return _strategies.GetOrAdd(key, _ => new ResiliencePipeline(CreatePipeline(_activator, context, configure))); #endif } - public bool TryAddBuilder(TKey key, Action, ConfigureBuilderContext> configure) => _builders.TryAdd(key, configure); + public bool TryAddBuilder(TKey key, Action, ConfigureBuilderContext> configure) => _builders.TryAdd(key, configure); public bool RemoveBuilder(TKey key) => _builders.TryRemove(key, out _); diff --git a/src/Polly.Core/Registry/ResilienceStrategyRegistry.cs b/src/Polly.Core/Registry/ResiliencePipelineRegistry.cs similarity index 53% rename from src/Polly.Core/Registry/ResilienceStrategyRegistry.cs rename to src/Polly.Core/Registry/ResiliencePipelineRegistry.cs index 23f5c0d9791..3f2751a6637 100644 --- a/src/Polly.Core/Registry/ResilienceStrategyRegistry.cs +++ b/src/Polly.Core/Registry/ResiliencePipelineRegistry.cs @@ -5,192 +5,192 @@ namespace Polly.Registry; /// -/// Represents a registry of resilience strategies and builders that are accessible by . +/// Represents a registry of resilience pipelines and builders that are accessible by . /// /// The type of the key. /// -/// This class provides a way to organize and manage multiple resilience strategies +/// This class provides a way to organize and manage multiple resilience pipelines /// using keys of type . /// -/// Additionally, it allows registration of callbacks that configure the strategy using . -/// These callbacks are called when the resilience strategy is not yet cached and it's retrieved for the first time. +/// Additionally, it allows registration of callbacks that configure the pipeline using . +/// These callbacks are called when the resilience pipeline is not yet cached and it's retrieved for the first time. /// /// -public sealed partial class ResilienceStrategyRegistry : ResilienceStrategyProvider +public sealed partial class ResiliencePipelineRegistry : ResiliencePipelineProvider where TKey : notnull { - private readonly Func _activator; - private readonly ConcurrentDictionary>> _builders; - private readonly ConcurrentDictionary _strategies; + private readonly Func _activator; + private readonly ConcurrentDictionary>> _builders; + private readonly ConcurrentDictionary _pipelines; private readonly ConcurrentDictionary _genericRegistry = new(); private readonly Func? _instanceNameFormatter; private readonly Func _builderNameFormatter; private readonly IEqualityComparer _builderComparer; - private readonly IEqualityComparer _strategyComparer; + private readonly IEqualityComparer _pipelineComparer; /// - /// Initializes a new instance of the class with the default comparer. + /// Initializes a new instance of the class with the default comparer. /// - public ResilienceStrategyRegistry() - : this(new ResilienceStrategyRegistryOptions()) + public ResiliencePipelineRegistry() + : this(new ResiliencePipelineRegistryOptions()) { } /// - /// Initializes a new instance of the class with a custom builder factory and comparer. + /// Initializes a new instance of the class with a custom builder factory and comparer. /// /// The registry options. /// Thrown when are invalid. /// Thrown when are . - public ResilienceStrategyRegistry(ResilienceStrategyRegistryOptions options) + public ResiliencePipelineRegistry(ResiliencePipelineRegistryOptions options) { Guard.NotNull(options); Guard.NotNull(options.BuilderFactory); - Guard.NotNull(options.StrategyComparer); + Guard.NotNull(options.PipelineComparer); Guard.NotNull(options.BuilderComparer); Guard.NotNull(options.BuilderNameFormatter); _activator = options.BuilderFactory; - _builders = new ConcurrentDictionary>>(options.BuilderComparer); - _strategies = new ConcurrentDictionary(options.StrategyComparer); + _builders = new ConcurrentDictionary>>(options.BuilderComparer); + _pipelines = new ConcurrentDictionary(options.PipelineComparer); _instanceNameFormatter = options.InstanceNameFormatter; _builderNameFormatter = options.BuilderNameFormatter; _builderComparer = options.BuilderComparer; - _strategyComparer = options.StrategyComparer; + _pipelineComparer = options.PipelineComparer; } /// - /// Tries to add an existing resilience strategy to the registry. + /// Tries to add an existing resilience pipeline to the registry. /// - /// The key used to identify the resilience strategy. - /// The resilience strategy instance. - /// if the strategy was added successfully, otherwise. - /// Thrown when is . - public bool TryAddStrategy(TKey key, ResilienceStrategy strategy) + /// The key used to identify the resilience pipeline. + /// The resilience pipeline instance. + /// if the pipeline was added successfully, otherwise. + /// Thrown when is . + public bool TryAddPipeline(TKey key, ResiliencePipeline pipeline) { - Guard.NotNull(strategy); + Guard.NotNull(pipeline); - return _strategies.TryAdd(key, strategy); + return _pipelines.TryAdd(key, pipeline); } /// - /// Tries to add an existing generic resilience strategy to the registry. + /// Tries to add an existing generic resilience pipeline to the registry. /// - /// The type of result that the resilience strategy handles. - /// The key used to identify the resilience strategy. - /// The resilience strategy instance. - /// if the strategy was added successfully, otherwise. - /// Thrown when is . - public bool TryAddStrategy(TKey key, ResilienceStrategy strategy) + /// The type of result that the resilience pipeline handles. + /// The key used to identify the resilience pipeline. + /// The resilience pipeline instance. + /// if the pipeline was added successfully, otherwise. + /// Thrown when is . + public bool TryAddPipeline(TKey key, ResiliencePipeline pipeline) { - Guard.NotNull(strategy); + Guard.NotNull(pipeline); - return GetGenericRegistry().TryAdd(key, strategy); + return GetGenericRegistry().TryAdd(key, pipeline); } /// - /// Removes a resilience strategy from the registry. + /// Removes a resilience pipeline from the registry. /// - /// The key used to identify the resilience strategy. - /// if the strategy was removed successfully, otherwise. - public bool RemoveStrategy(TKey key) => _strategies.TryRemove(key, out _); + /// The key used to identify the resilience pipeline. + /// if the pipeline was removed successfully, otherwise. + public bool RemovePipeline(TKey key) => _pipelines.TryRemove(key, out _); /// - /// Removes a generic resilience strategy from the registry. + /// Removes a generic resilience pipeline from the registry. /// - /// The type of result that the resilience strategy handles. - /// The key used to identify the resilience strategy. - /// if the strategy was removed successfully, otherwise. - public bool RemoveStrategy(TKey key) => GetGenericRegistry().Remove(key); + /// The type of result that the resilience pipeline handles. + /// The key used to identify the resilience pipeline. + /// if the pipeline was removed successfully, otherwise. + public bool RemovePipeline(TKey key) => GetGenericRegistry().Remove(key); /// - public override bool TryGetStrategy(TKey key, [NotNullWhen(true)] out ResilienceStrategy? strategy) + public override bool TryGetPipeline(TKey key, [NotNullWhen(true)] out ResiliencePipeline? pipeline) { - return GetGenericRegistry().TryGet(key, out strategy); + return GetGenericRegistry().TryGet(key, out pipeline); } /// - public override bool TryGetStrategy(TKey key, [NotNullWhen(true)] out ResilienceStrategy? strategy) + public override bool TryGetPipeline(TKey key, [NotNullWhen(true)] out ResiliencePipeline? pipeline) { - if (_strategies.TryGetValue(key, out strategy)) + if (_pipelines.TryGetValue(key, out pipeline)) { return true; } if (_builders.TryGetValue(key, out var configure)) { - strategy = GetOrAddStrategy(key, configure); + pipeline = GetOrAddPipeline(key, configure); return true; } - strategy = null; + pipeline = null; return false; } /// - /// Gets existing strategy or creates a new one using the callback. + /// Gets existing pipeline or creates a new one using the callback. /// - /// The key used to identify the resilience strategy. - /// The callback that configures the strategy builder. - /// An instance of strategy. - public ResilienceStrategy GetOrAddStrategy(TKey key, Action configure) + /// The key used to identify the resilience pipeline. + /// The callback that configures the pipeline builder. + /// An instance of pipeline. + public ResiliencePipeline GetOrAddPipeline(TKey key, Action configure) { Guard.NotNull(configure); - return GetOrAddStrategy(key, (builder, _) => configure(builder)); + return GetOrAddPipeline(key, (builder, _) => configure(builder)); } /// - /// Gets existing strategy or creates a new one using the callback. + /// Gets existing pipeline or creates a new one using the callback. /// - /// The key used to identify the resilience strategy. - /// The callback that configures the strategy builder. - /// An instance of strategy. - public ResilienceStrategy GetOrAddStrategy(TKey key, Action> configure) + /// The key used to identify the resilience pipeline. + /// The callback that configures the pipeline builder. + /// An instance of pipeline. + public ResiliencePipeline GetOrAddPipeline(TKey key, Action> configure) { Guard.NotNull(configure); - if (_strategies.TryGetValue(key, out var strategy)) + if (_pipelines.TryGetValue(key, out var pipeline)) { - return strategy; + return pipeline; } var context = new ConfigureBuilderContext(key, _builderNameFormatter(key), _instanceNameFormatter?.Invoke(key)); #if NETCOREAPP3_0_OR_GREATER - return _strategies.GetOrAdd(key, static (_, factory) => + return _pipelines.GetOrAdd(key, static (_, factory) => { - return CreateStrategy(factory.instance._activator, factory.context, factory.configure); + return CreatePipeline(factory.instance._activator, factory.context, factory.configure); }, (instance: this, context, configure)); #else - return _strategies.GetOrAdd(key, _ => CreateStrategy(_activator, context, configure)); + return _pipelines.GetOrAdd(key, _ => CreatePipeline(_activator, context, configure)); #endif } /// - /// Gets existing strategy or creates a new one using the callback. + /// Gets existing pipeline or creates a new one using the callback. /// - /// The type of result that the resilience strategy handles. - /// The key used to identify the resilience strategy. - /// The callback that configures the strategy builder. - /// An instance of strategy. - public ResilienceStrategy GetOrAddStrategy(TKey key, Action> configure) + /// The type of result that the resilience pipeline handles. + /// The key used to identify the resilience pipeline. + /// The callback that configures the pipeline builder. + /// An instance of pipeline. + public ResiliencePipeline GetOrAddPipeline(TKey key, Action> configure) { Guard.NotNull(configure); - return GetOrAddStrategy(key, (builder, _) => configure(builder)); + return GetOrAddPipeline(key, (builder, _) => configure(builder)); } /// - /// Gets existing strategy or creates a new one using the callback. + /// Gets existing pipeline or creates a new one using the callback. /// - /// The type of result that the resilience strategy handles. - /// The key used to identify the resilience strategy. - /// The callback that configures the strategy builder. - /// An instance of strategy. - public ResilienceStrategy GetOrAddStrategy(TKey key, Action, ConfigureBuilderContext> configure) + /// The type of result that the resilience pipeline handles. + /// The key used to identify the resilience pipeline. + /// The callback that configures the pipeline builder. + /// An instance of pipeline. + public ResiliencePipeline GetOrAddPipeline(TKey key, Action, ConfigureBuilderContext> configure) { Guard.NotNull(configure); @@ -198,16 +198,16 @@ public ResilienceStrategy GetOrAddStrategy(TKey key, Action - /// Tries to add a resilience strategy builder to the registry. + /// Tries to add a resilience pipeline builder to the registry. /// - /// The key used to identify the strategy builder. - /// The action that configures the resilience strategy builder. + /// The key used to identify the pipeline builder. + /// The action that configures the resilience pipeline builder. /// if the builder was added successfully, otherwise. /// - /// Use this method when you want to create the strategy on-demand when it's first accessed. + /// Use this method when you want to create the pipeline on-demand when it's first accessed. /// /// Thrown when is . - public bool TryAddBuilder(TKey key, Action> configure) + public bool TryAddBuilder(TKey key, Action> configure) { Guard.NotNull(configure); @@ -215,17 +215,17 @@ public bool TryAddBuilder(TKey key, Action - /// Tries to add a generic resilience strategy builder to the registry. + /// Tries to add a generic resilience pipeline builder to the registry. /// - /// The type of result that the resilience strategy handles. - /// The key used to identify the strategy builder. - /// The action that configures the resilience strategy builder. + /// The type of result that the resilience pipeline handles. + /// The key used to identify the pipeline builder. + /// The action that configures the resilience pipeline builder. /// if the builder was added successfully, otherwise. /// - /// Use this method when you want to create the strategy on-demand when it's first accessed. + /// Use this method when you want to create the pipeline on-demand when it's first accessed. /// /// Thrown when is . - public bool TryAddBuilder(TKey key, Action, ConfigureBuilderContext> configure) + public bool TryAddBuilder(TKey key, Action, ConfigureBuilderContext> configure) { Guard.NotNull(configure); @@ -233,42 +233,42 @@ public bool TryAddBuilder(TKey key, Action - /// Removes a resilience strategy builder from the registry. + /// Removes a resilience pipeline builder from the registry. /// - /// The key used to identify the resilience strategy builder. + /// The key used to identify the resilience pipeline builder. /// if the builder was removed successfully, otherwise. public bool RemoveBuilder(TKey key) => _builders.TryRemove(key, out _); /// - /// Removes a generic resilience strategy builder from the registry. + /// Removes a generic resilience pipeline builder from the registry. /// - /// The type of result that the resilience strategy handles. - /// The key used to identify the resilience strategy builder. + /// The type of result that the resilience pipeline handles. + /// The key used to identify the resilience pipeline builder. /// if the builder was removed successfully, otherwise. public bool RemoveBuilder(TKey key) => GetGenericRegistry().RemoveBuilder(key); /// - /// Clears all cached strategies. + /// Clears all cached pipelines. /// /// - /// This method only clears the cached strategies, the registered builders are kept unchanged. + /// This method only clears the cached pipelines, the registered builders are kept unchanged. /// - public void ClearStrategies() => _strategies.Clear(); + public void ClearPipelines() => _pipelines.Clear(); /// - /// Clears all cached generic strategies. + /// Clears all cached generic pipelines. /// - /// The type of result that the resilience strategy handles. + /// The type of result that the resilience pipeline handles. /// - /// This method only clears the cached strategies, the registered builders are kept unchanged. + /// This method only clears the cached pipelines, the registered builders are kept unchanged. /// - public void ClearStrategies() => GetGenericRegistry().Clear(); + public void ClearPipelines() => GetGenericRegistry().Clear(); - private static ResilienceStrategy CreateStrategy( + private static ResiliencePipeline CreatePipeline( Func activator, ConfigureBuilderContext context, Action> configure) - where TBuilder : CompositeStrategyBuilderBase + where TBuilder : ResiliencePipelineBuilderBase { Func factory = () => { @@ -281,18 +281,18 @@ private static ResilienceStrategy CreateStrategy( }; var builder = factory(); - var strategy = builder.BuildStrategy(); + var pipeline = builder.BuildPipeline(); var diagnosticSource = builder.DiagnosticSource; if (context.ReloadTokenProducer is null) { - return strategy; + return pipeline; } - return new ReloadableResilienceStrategy( - strategy, + return new ReloadableResiliencePipeline( + pipeline, context.ReloadTokenProducer(), - () => factory().BuildStrategy(), + () => factory().BuildPipeline(), TelemetryUtil.CreateTelemetry( diagnosticSource, context.BuilderName, @@ -311,9 +311,9 @@ private GenericRegistry GetGenericRegistry() return (GenericRegistry)_genericRegistry.GetOrAdd(typeof(TResult), _ => { return new GenericRegistry( - () => new CompositeStrategyBuilder(_activator()), + () => new ResiliencePipelineBuilder(_activator()), _builderComparer, - _strategyComparer, + _pipelineComparer, _builderNameFormatter, _instanceNameFormatter); }); diff --git a/src/Polly.Core/Registry/ResilienceStrategyRegistryOptions.cs b/src/Polly.Core/Registry/ResiliencePipelineRegistryOptions.cs similarity index 75% rename from src/Polly.Core/Registry/ResilienceStrategyRegistryOptions.cs rename to src/Polly.Core/Registry/ResiliencePipelineRegistryOptions.cs index 1c721f302d1..1f54f2a08c8 100644 --- a/src/Polly.Core/Registry/ResilienceStrategyRegistryOptions.cs +++ b/src/Polly.Core/Registry/ResiliencePipelineRegistryOptions.cs @@ -3,31 +3,31 @@ namespace Polly.Registry; /// -/// An options class used by . +/// An options class used by . /// /// The type of the key used by the registry. -public class ResilienceStrategyRegistryOptions +public class ResiliencePipelineRegistryOptions { /// - /// Gets or sets the factory method that creates instances of . + /// Gets or sets the factory method that creates instances of . /// /// - /// The default value is a function that creates a new instance of using the default constructor. + /// The default value is a function that creates a new instance of using the default constructor. /// [Required] - public Func BuilderFactory { get; set; } = static () => new CompositeStrategyBuilder(); + public Func BuilderFactory { get; set; } = static () => new ResiliencePipelineBuilder(); /// - /// Gets or sets the comparer that is used by the registry to retrieve the resilience strategies. + /// Gets or sets the comparer that is used by the registry to retrieve the resilience pipelines. /// /// /// The default value is . /// [Required] - public IEqualityComparer StrategyComparer { get; set; } = EqualityComparer.Default; + public IEqualityComparer PipelineComparer { get; set; } = EqualityComparer.Default; /// - /// Gets or sets the comparer that is used by the registry to retrieve the resilience strategy builders. + /// Gets or sets the comparer that is used by the registry to retrieve the resilience pipeline builders. /// /// /// The default value is . @@ -41,7 +41,7 @@ public class ResilienceStrategyRegistryOptions /// /// /// Use custom formatter for composite keys in case you want to have different metric values for a builder and instance key. - /// In general, strategies can have the same builder name and different instance names. + /// In general, pipelines can have the same builder name and different instance names. /// /// /// The default value is . @@ -54,7 +54,7 @@ public class ResilienceStrategyRegistryOptions /// /// /// Use custom formatter for composite keys in case you want to have different metric values for a builder and strategy key. - /// In general, strategies can have the same builder name and different strategy keys. + /// In general, pipelines can have the same builder name and different pippeline keys. /// /// /// The default value is a formatter that formats the keys using the method. diff --git a/src/Polly.Core/Registry/ResilienceStrategyProvider.cs b/src/Polly.Core/Registry/ResilienceStrategyProvider.cs deleted file mode 100644 index efb94db849f..00000000000 --- a/src/Polly.Core/Registry/ResilienceStrategyProvider.cs +++ /dev/null @@ -1,65 +0,0 @@ -using System.Diagnostics.CodeAnalysis; - -namespace Polly.Registry; - -#pragma warning disable CA1716 // Identifiers should not match keywords - -/// -/// Represents a provider for resilience strategies that are accessible by . -/// -/// The type of the key. -public abstract class ResilienceStrategyProvider - where TKey : notnull -{ - /// - /// Retrieves a resilience strategy from the provider using the specified key. - /// - /// The key used to identify the resilience strategy. - /// The resilience strategy associated with the specified key. - /// Thrown when no resilience strategy is found for the specified key. - public virtual ResilienceStrategy GetStrategy(TKey key) - { - if (TryGetStrategy(key, out var strategy)) - { - return strategy; - } - - throw new KeyNotFoundException($"Unable to find a resilience strategy associated with the key '{key}'. " + - $"Please ensure that either the resilience strategy or the builder is registered."); - } - - /// - /// Retrieves a generic resilience strategy from the provider using the specified key. - /// - /// The type of result that the resilience strategy handles. - /// The key used to identify the resilience strategy. - /// The resilience strategy associated with the specified key. - /// Thrown when no resilience strategy is found for the specified key. - public virtual ResilienceStrategy GetStrategy(TKey key) - { - if (TryGetStrategy(key, out var strategy)) - { - return strategy; - } - - throw new KeyNotFoundException($"Unable to find a generic resilience strategy of '{typeof(TResult).Name}' associated with the key '{key}'. " + - $"Please ensure that either the generic resilience strategy or the generic builder is registered."); - } - - /// - /// Tries to get a resilience strategy from the provider using the specified key. - /// - /// The key used to identify the resilience strategy. - /// The output resilience strategy if found, otherwise. - /// if the strategy was found, otherwise. - public abstract bool TryGetStrategy(TKey key, [NotNullWhen(true)] out ResilienceStrategy? strategy); - - /// - /// Tries to get a generic resilience strategy from the provider using the specified key. - /// - /// The type of result that the resilience strategy handles. - /// The key used to identify the resilience strategy. - /// The output resilience strategy if found, otherwise. - /// if the strategy was found, otherwise. - public abstract bool TryGetStrategy(TKey key, [NotNullWhen(true)] out ResilienceStrategy? strategy); -} diff --git a/src/Polly.Core/ResilienceContext.cs b/src/Polly.Core/ResilienceContext.cs index 59e41a65035..49acc2aea86 100644 --- a/src/Polly.Core/ResilienceContext.cs +++ b/src/Polly.Core/ResilienceContext.cs @@ -4,8 +4,8 @@ namespace Polly; /// -/// A context assigned to a single execution of . It is created manually or automatically -/// when the user calls the various extensions on top of . After every execution the context should be discarded and returned to the pool. +/// A context assigned to a single execution of . It is created manually or automatically +/// when the user calls the various extensions on top of . After every execution the context should be discarded and returned to the pool. /// /// /// Do not re-use an instance of across more than one execution. The is retrieved from the pool @@ -26,7 +26,7 @@ internal ResilienceContext() /// Gets a key unique to the call site of the current execution. /// /// - /// Resilience strategy instances are commonly reused across multiple call sites. + /// Resilience context instances are commonly reused across multiple call sites. /// Set an so that logging and metrics can distinguish usages of policy instances at different call sites. /// The operation key value should have a low cardinality (i.e. do not assign values such as to this property). /// diff --git a/src/Polly.Core/ResilienceStrategy.Async.cs b/src/Polly.Core/ResiliencePipeline.Async.cs similarity index 99% rename from src/Polly.Core/ResilienceStrategy.Async.cs rename to src/Polly.Core/ResiliencePipeline.Async.cs index e3d089ced95..308d214c2c4 100644 --- a/src/Polly.Core/ResilienceStrategy.Async.cs +++ b/src/Polly.Core/ResiliencePipeline.Async.cs @@ -3,7 +3,7 @@ namespace Polly; #pragma warning disable CA1031 // Do not catch general exception types #pragma warning disable RS0027 // API with optional parameter(s) should have the most parameters amongst its public overloads -public abstract partial class ResilienceStrategy +public abstract partial class ResiliencePipeline { /// /// Executes the specified callback. diff --git a/src/Polly.Core/ResilienceStrategy.AsyncT.cs b/src/Polly.Core/ResiliencePipeline.AsyncT.cs similarity index 99% rename from src/Polly.Core/ResilienceStrategy.AsyncT.cs rename to src/Polly.Core/ResiliencePipeline.AsyncT.cs index 1c18fa954d4..ce22820a711 100644 --- a/src/Polly.Core/ResilienceStrategy.AsyncT.cs +++ b/src/Polly.Core/ResiliencePipeline.AsyncT.cs @@ -3,7 +3,7 @@ namespace Polly; #pragma warning disable CA1031 // Do not catch general exception types #pragma warning disable RS0027 // API with optional parameter(s) should have the most parameters amongst its public overloads -public abstract partial class ResilienceStrategy +public abstract partial class ResiliencePipeline { /// /// Executes the specified outcome-based callback. diff --git a/src/Polly.Core/ResilienceStrategy.Sync.cs b/src/Polly.Core/ResiliencePipeline.Sync.cs similarity index 99% rename from src/Polly.Core/ResilienceStrategy.Sync.cs rename to src/Polly.Core/ResiliencePipeline.Sync.cs index c1aee0b5362..57f3ffdc114 100644 --- a/src/Polly.Core/ResilienceStrategy.Sync.cs +++ b/src/Polly.Core/ResiliencePipeline.Sync.cs @@ -3,7 +3,7 @@ namespace Polly; #pragma warning disable CA1031 // Do not catch general exception types #pragma warning disable RS0027 // API with optional parameter(s) should have the most parameters amongst its public overloads -public abstract partial class ResilienceStrategy +public abstract partial class ResiliencePipeline { /// /// Executes the specified callback. diff --git a/src/Polly.Core/ResilienceStrategy.SyncT.cs b/src/Polly.Core/ResiliencePipeline.SyncT.cs similarity index 99% rename from src/Polly.Core/ResilienceStrategy.SyncT.cs rename to src/Polly.Core/ResiliencePipeline.SyncT.cs index 7deff6b9eba..18c61e0231b 100644 --- a/src/Polly.Core/ResilienceStrategy.SyncT.cs +++ b/src/Polly.Core/ResiliencePipeline.SyncT.cs @@ -3,7 +3,7 @@ namespace Polly; #pragma warning disable CA1031 // Do not catch general exception types #pragma warning disable RS0027 // API with optional parameter(s) should have the most parameters amongst its public overloads -public abstract partial class ResilienceStrategy +public abstract partial class ResiliencePipeline { /// /// Executes the specified callback. diff --git a/src/Polly.Core/ResiliencePipeline.cs b/src/Polly.Core/ResiliencePipeline.cs new file mode 100644 index 00000000000..079040de805 --- /dev/null +++ b/src/Polly.Core/ResiliencePipeline.cs @@ -0,0 +1,40 @@ +namespace Polly; + +/// +/// Resilience pipeline is used to execute the user-provided callbacks. +/// +/// +/// Resilience pipeline supports various types of callbacks and provides a unified way to execute them. +/// This includes overloads for synchronous and asynchronous callbacks, generic and non-generic callbacks. +/// +public partial class ResiliencePipeline +{ + internal static ResilienceContextPool Pool => ResilienceContextPool.Shared; + + internal ResilienceStrategyOptions? Options { get; set; } + + internal ResiliencePipeline() + { + } + + internal abstract ValueTask> ExecuteCore( + Func>> callback, + ResilienceContext context, + TState state); + + private Outcome ExecuteCoreSync( + Func> callback, + ResilienceContext context, + TState state) + { + return ExecuteCore( + static (context, state) => + { + var result = state.callback(context, state.state); + + return new ValueTask>(result); + }, + context, + (callback, state)).GetResult(); + } +} diff --git a/src/Polly.Core/CompositeStrategyBuilder.TResult.cs b/src/Polly.Core/ResiliencePipelineBuilder.TResult.cs similarity index 50% rename from src/Polly.Core/CompositeStrategyBuilder.TResult.cs rename to src/Polly.Core/ResiliencePipelineBuilder.TResult.cs index dba2ef3763f..6741b4f0e3f 100644 --- a/src/Polly.Core/CompositeStrategyBuilder.TResult.cs +++ b/src/Polly.Core/ResiliencePipelineBuilder.TResult.cs @@ -3,32 +3,32 @@ namespace Polly; /// -/// A builder that is used to create an instance of . +/// A builder that is used to create an instance of . /// /// The type of result to handle. /// -/// The builder supports combining multiple strategies into a composite resilience strategy. -/// The resulting instance of created by the call will execute the strategies in the same order they were added to the builder. +/// The builder supports combining multiple strategies into a pipeline of resilience strategies. +/// The resulting instance of created by the call will execute the strategies in the same order they were added to the builder. /// The order of the strategies is important. /// -public sealed class CompositeStrategyBuilder : CompositeStrategyBuilderBase +public sealed class ResiliencePipelineBuilder : ResiliencePipelineBuilderBase { /// - /// Initializes a new instance of the class. + /// Initializes a new instance of the class. /// - public CompositeStrategyBuilder() + public ResiliencePipelineBuilder() { } - internal CompositeStrategyBuilder(CompositeStrategyBuilderBase other) + internal ResiliencePipelineBuilder(ResiliencePipelineBuilderBase other) : base(other) { } /// - /// Builds the resilience strategy. + /// Builds the resilience pipeline. /// - /// An instance of . + /// An instance of . /// Thrown when this builder has invalid configuration. - public ResilienceStrategy Build() => new(BuildStrategy()); + public ResiliencePipeline Build() => new(BuildPipeline()); } diff --git a/src/Polly.Core/ResiliencePipelineBuilder.cs b/src/Polly.Core/ResiliencePipelineBuilder.cs new file mode 100644 index 00000000000..30ca4a25ea6 --- /dev/null +++ b/src/Polly.Core/ResiliencePipelineBuilder.cs @@ -0,0 +1,21 @@ +using System.ComponentModel.DataAnnotations; + +namespace Polly; + +/// +/// A builder that is used to create an instance of . +/// +/// +/// The builder supports combining multiple strategies into a pipeline of resilience strategies. +/// The resulting instance of created by the call executes the strategies in the same order they were added to the builder. +/// The order of the strategies is important. +/// +public sealed class ResiliencePipelineBuilder : ResiliencePipelineBuilderBase +{ + /// + /// Builds the resilience pipeline. + /// + /// An instance of . + /// Thrown when this builder has invalid configuration. + public ResiliencePipeline Build() => BuildPipeline(); +} diff --git a/src/Polly.Core/CompositeStrategyBuilderBase.cs b/src/Polly.Core/ResiliencePipelineBuilderBase.cs similarity index 84% rename from src/Polly.Core/CompositeStrategyBuilderBase.cs rename to src/Polly.Core/ResiliencePipelineBuilderBase.cs index a2017cc5eba..c5a031a729d 100644 --- a/src/Polly.Core/CompositeStrategyBuilderBase.cs +++ b/src/Polly.Core/ResiliencePipelineBuilderBase.cs @@ -7,23 +7,23 @@ namespace Polly; /// -/// A builder that is used to create an instance of . +/// A builder that is used to create an instance of . /// /// -/// The builder supports combining multiple strategies into a composite resilience strategy. -/// The resulting instance of executes the strategies in the same order they were added to the builder. +/// The builder supports combining multiple strategies into a pipeline of resilience strategies. +/// The resulting instance of executes the strategies in the same order they were added to the builder. /// The order of the strategies is important. /// -public abstract class CompositeStrategyBuilderBase +public abstract class ResiliencePipelineBuilderBase { private readonly List _entries = new(); private bool _used; - private protected CompositeStrategyBuilderBase() + private protected ResiliencePipelineBuilderBase() { } - private protected CompositeStrategyBuilderBase(CompositeStrategyBuilderBase other) + private protected ResiliencePipelineBuilderBase(ResiliencePipelineBuilderBase other) { Name = other.Name; Properties = other.Properties; @@ -109,7 +109,7 @@ private protected CompositeStrategyBuilderBase(CompositeStrategyBuilderBase othe public Action Validator { get; private protected set; } = ValidationHelper.ValidateObject; [RequiresUnreferencedCode(Constants.OptionsValidation)] - internal void AddStrategyCore(Func factory, ResilienceStrategyOptions options) + internal void AddStrategyCore(Func factory, ResilienceStrategyOptions options) { Guard.NotNull(factory); Guard.NotNull(options); @@ -118,32 +118,32 @@ internal void AddStrategyCore(Func f if (_used) { - throw new InvalidOperationException("Cannot add any more resilience strategies to the builder after it has been used to build a strategy once."); + throw new InvalidOperationException("Cannot add any more resilience strategies to the builder after it has been used to build a pipeline once."); } _entries.Add(new Entry(factory, options)); } - internal ResilienceStrategy BuildStrategy() + internal ResiliencePipeline BuildPipeline() { - Validator(new(this, $"The '{nameof(CompositeStrategyBuilder)}' configuration is invalid.")); + Validator(new(this, $"The '{nameof(ResiliencePipelineBuilder)}' configuration is invalid.")); _used = true; - var strategies = _entries.Select(CreateResilienceStrategy).ToList(); + var strategies = _entries.Select(CreateResiliencePipeline).ToList(); if (strategies.Count == 0) { - return NullResilienceStrategy.Instance; + return NullResiliencePipeline.Instance; } - return CompositeResilienceStrategy.Create( + return CompositeResiliencePipeline.Create( strategies, TelemetryUtil.CreateTelemetry(DiagnosticSource, Name, InstanceName, Properties, null), TimeProvider); } - private ResilienceStrategy CreateResilienceStrategy(Entry entry) + private ResiliencePipeline CreateResiliencePipeline(Entry entry) { var context = new StrategyBuilderContext( builderName: Name, @@ -159,5 +159,5 @@ private ResilienceStrategy CreateResilienceStrategy(Entry entry) return strategy; } - private sealed record Entry(Func Factory, ResilienceStrategyOptions Options); + private sealed record Entry(Func Factory, ResilienceStrategyOptions Options); } diff --git a/src/Polly.Core/CompositeStrategyBuilderExtensions.cs b/src/Polly.Core/ResiliencePipelineBuilderExtensions.cs similarity index 69% rename from src/Polly.Core/CompositeStrategyBuilderExtensions.cs rename to src/Polly.Core/ResiliencePipelineBuilderExtensions.cs index 0417afcb0a5..17923e51f6e 100644 --- a/src/Polly.Core/CompositeStrategyBuilderExtensions.cs +++ b/src/Polly.Core/ResiliencePipelineBuilderExtensions.cs @@ -4,52 +4,52 @@ namespace Polly; /// -/// Extensions for . +/// Extensions for . /// -public static class CompositeStrategyBuilderExtensions +public static class ResiliencePipelineBuilderExtensions { /// - /// Adds an already created strategy instance to the builder. + /// Adds an already created pipeline instance to the builder. /// /// The builder type. /// The builder instance. - /// The strategy instance. + /// The pipeline instance. /// The same builder instance. - /// Thrown when is null. - /// Thrown when this builder was already used to create a strategy. The builder cannot be modified after it has been used. + /// Thrown when is null. + /// Thrown when this builder was already used to create a pipeline. The builder cannot be modified after it has been used. [UnconditionalSuppressMessage( "Trimming", "IL2026:Members annotated with 'RequiresUnreferencedCodeAttribute' require dynamic access otherwise can break functionality when trimming application code", Justification = "The EmptyOptions have nothing to validate.")] - public static TBuilder AddStrategy(this TBuilder builder, ResilienceStrategy strategy) - where TBuilder : CompositeStrategyBuilderBase + public static TBuilder AddPipeline(this TBuilder builder, ResiliencePipeline pipeline) + where TBuilder : ResiliencePipelineBuilderBase { Guard.NotNull(builder); - Guard.NotNull(strategy); + Guard.NotNull(pipeline); - builder.AddStrategyCore(_ => strategy, EmptyOptions.Instance); + builder.AddStrategyCore(_ => pipeline, EmptyOptions.Instance); return builder; } /// - /// Adds an already created strategy instance to the builder. + /// Adds an already created pipeline instance to the builder. /// /// The type of the result. /// The builder instance. - /// The strategy instance. + /// The pipeline instance. /// The same builder instance. - /// Thrown when is null. + /// Thrown when is null. /// Thrown when this builder was already used to create a strategy. The builder cannot be modified after it has been used. - public static CompositeStrategyBuilder AddStrategy(this CompositeStrategyBuilder builder, ResilienceStrategy strategy) + public static ResiliencePipelineBuilder AddPipeline(this ResiliencePipelineBuilder builder, ResiliencePipeline pipeline) { Guard.NotNull(builder); - Guard.NotNull(strategy); + Guard.NotNull(pipeline); - return builder.AddStrategy(strategy.Strategy); + return builder.AddPipeline(pipeline.Strategy); } /// - /// Adds a strategy to the builder. + /// Adds a non-reactive strategy to the builder. /// /// The builder type. /// The builder instance. @@ -57,17 +57,17 @@ public static CompositeStrategyBuilder AddStrategy(this Compos /// The options associated with the strategy. If none are provided the default instance of is created. /// The same builder instance. /// Thrown when , or is . - /// Thrown when this builder was already used to create a strategy. The builder cannot be modified after it has been used. + /// Thrown when this builder was already used to create a pipeline. The builder cannot be modified after it has been used. /// Thrown when is invalid. [RequiresUnreferencedCode(Constants.OptionsValidation)] - public static TBuilder AddStrategy(this TBuilder builder, Func factory, ResilienceStrategyOptions options) - where TBuilder : CompositeStrategyBuilderBase + public static TBuilder AddStrategy(this TBuilder builder, Func factory, ResilienceStrategyOptions options) + where TBuilder : ResiliencePipelineBuilderBase { Guard.NotNull(builder); Guard.NotNull(factory); Guard.NotNull(options); - builder.AddStrategyCore(context => new NonReactiveResilienceStrategyBridge(factory(context)), options); + builder.AddStrategyCore(context => new ResiliencePipelineBridge(factory(context)), options); return builder; } @@ -79,18 +79,18 @@ public static TBuilder AddStrategy(this TBuilder builder, FuncThe options associated with the strategy. If none are provided the default instance of is created. /// The same builder instance. /// Thrown when , or is . - /// Thrown when this builder was already used to create a strategy. The builder cannot be modified after it has been used. + /// Thrown when this builder was already used to create a pipeline. The builder cannot be modified after it has been used. /// Thrown when is invalid. [RequiresUnreferencedCode(Constants.OptionsValidation)] - public static CompositeStrategyBuilder AddStrategy( - this CompositeStrategyBuilder builder, Func> factory, + public static ResiliencePipelineBuilder AddStrategy( + this ResiliencePipelineBuilder builder, Func> factory, ResilienceStrategyOptions options) { Guard.NotNull(builder); Guard.NotNull(factory); Guard.NotNull(options); - builder.AddStrategyCore(context => new ReactiveResilienceStrategyBridge(factory(context)), options); + builder.AddStrategyCore(context => new ResiliencePipelineBridge(factory(context)), options); return builder; } @@ -103,18 +103,18 @@ public static CompositeStrategyBuilder AddStrategy( /// The options associated with the strategy. If none are provided the default instance of is created. /// The same builder instance. /// Thrown when , or is . - /// Thrown when this builder was already used to create a strategy. The builder cannot be modified after it has been used. + /// Thrown when this builder was already used to create a pipeline. The builder cannot be modified after it has been used. /// Thrown when is invalid. [RequiresUnreferencedCode(Constants.OptionsValidation)] - public static CompositeStrategyBuilder AddStrategy( - this CompositeStrategyBuilder builder, Func> factory, + public static ResiliencePipelineBuilder AddStrategy( + this ResiliencePipelineBuilder builder, Func> factory, ResilienceStrategyOptions options) { Guard.NotNull(builder); Guard.NotNull(factory); Guard.NotNull(options); - builder.AddStrategyCore(context => new ReactiveResilienceStrategyBridge(factory(context)), options); + builder.AddStrategyCore(context => new ResiliencePipelineBridge(factory(context)), options); return builder; } diff --git a/src/Polly.Core/ResilienceStrategyT.Async.cs b/src/Polly.Core/ResiliencePipelineT.Async.cs similarity index 99% rename from src/Polly.Core/ResilienceStrategyT.Async.cs rename to src/Polly.Core/ResiliencePipelineT.Async.cs index d29a429e5f5..fe9cc6fe090 100644 --- a/src/Polly.Core/ResilienceStrategyT.Async.cs +++ b/src/Polly.Core/ResiliencePipelineT.Async.cs @@ -2,7 +2,7 @@ namespace Polly; #pragma warning disable RS0027 // API with optional parameter(s) should have the most parameters amongst its public overloads -public partial class ResilienceStrategy +public partial class ResiliencePipeline { /// /// Executes the specified callback. diff --git a/src/Polly.Core/ResilienceStrategyT.Sync.cs b/src/Polly.Core/ResiliencePipelineT.Sync.cs similarity index 99% rename from src/Polly.Core/ResilienceStrategyT.Sync.cs rename to src/Polly.Core/ResiliencePipelineT.Sync.cs index b21034af0e0..be2baeadc05 100644 --- a/src/Polly.Core/ResilienceStrategyT.Sync.cs +++ b/src/Polly.Core/ResiliencePipelineT.Sync.cs @@ -2,7 +2,7 @@ namespace Polly; #pragma warning disable RS0027 // API with optional parameter(s) should have the most parameters amongst its public overloads -public partial class ResilienceStrategy +public partial class ResiliencePipeline { /// /// Executes the specified callback. diff --git a/src/Polly.Core/ResiliencePipelineT.cs b/src/Polly.Core/ResiliencePipelineT.cs new file mode 100644 index 00000000000..8b8268df882 --- /dev/null +++ b/src/Polly.Core/ResiliencePipelineT.cs @@ -0,0 +1,16 @@ +namespace Polly; + +/// +/// Resilience pipeline is used to execute the user-provided callbacks. +/// +/// The type of result this pipeline supports. +/// +/// Resilience ppeline supports various types of callbacks of result type +/// and provides a unified way to execute them. This includes overloads for synchronous and asynchronous callbacks. +/// +public partial class ResiliencePipeline +{ + internal ResiliencePipeline(ResiliencePipeline strategy) => Strategy = strategy; + + internal ResiliencePipeline Strategy { get; } +} diff --git a/src/Polly.Core/ReactiveResilienceStrategy.cs b/src/Polly.Core/ResilienceStrategy.TResult.cs similarity index 97% rename from src/Polly.Core/ReactiveResilienceStrategy.cs rename to src/Polly.Core/ResilienceStrategy.TResult.cs index 5a8a4e1886e..213d747f9a6 100644 --- a/src/Polly.Core/ReactiveResilienceStrategy.cs +++ b/src/Polly.Core/ResilienceStrategy.TResult.cs @@ -8,7 +8,7 @@ /// /// For strategies that handle all result types the generic parameter must be of type . /// -public abstract class ReactiveResilienceStrategy +public abstract class ResilienceStrategy { /// /// An implementation of a reactive resilience strategy that executes the specified . diff --git a/src/Polly.Core/ResilienceStrategy.cs b/src/Polly.Core/ResilienceStrategy.cs index 5989b5b865d..84d61f290aa 100644 --- a/src/Polly.Core/ResilienceStrategy.cs +++ b/src/Polly.Core/ResilienceStrategy.cs @@ -1,40 +1,36 @@ -namespace Polly; +namespace Polly; /// -/// Resilience strategy is used to execute the user-provided callbacks. +/// Base class for all non-reactive resilience strategies. /// -/// -/// Resilience strategy supports various types of callbacks and provides a unified way to execute them. -/// This includes overloads for synchronous and asynchronous callbacks, generic and non-generic callbacks. -/// -public partial class ResilienceStrategy +public abstract class ResilienceStrategy { - internal static ResilienceContextPool Pool => ResilienceContextPool.Shared; - - internal ResilienceStrategyOptions? Options { get; set; } - - internal ResilienceStrategy() - { - } - - internal abstract ValueTask> ExecuteCore( + /// + /// An implementation of a non-reactive resilience strategy that executes the specified . + /// + /// The type of result returned by the callback. + /// The type of state associated with the callback. + /// The user-provided callback. + /// The context associated with the callback. + /// The state associated with the callback. + /// + /// An instance of a pending for asynchronous executions or a completed task for synchronous executions. + /// + /// + /// This method is called for both synchronous and asynchronous execution flows. + /// + /// You can use to determine whether is synchronous or asynchronous. + /// This is useful when the custom strategy behaves differently in each execution flow. In general, for most strategies, the implementation + /// is the same for both execution flows. + /// See for more details. + /// + /// + /// The provided callback never throws an exception. Instead, the exception is captured and converted to an . + /// Similarly, do not throw exceptions from your strategy implementation. Instead, return an exception instance as . + /// + /// + protected internal abstract ValueTask> ExecuteCore( Func>> callback, ResilienceContext context, TState state); - - private Outcome ExecuteCoreSync( - Func> callback, - ResilienceContext context, - TState state) - { - return ExecuteCore( - static (context, state) => - { - var result = state.callback(context, state.state); - - return new ValueTask>(result); - }, - context, - (callback, state)).GetResult(); - } } diff --git a/src/Polly.Core/ResilienceStrategyOptions.cs b/src/Polly.Core/ResilienceStrategyOptions.cs index 2ffb19f09df..c774dd98b2a 100644 --- a/src/Polly.Core/ResilienceStrategyOptions.cs +++ b/src/Polly.Core/ResilienceStrategyOptions.cs @@ -1,7 +1,7 @@ namespace Polly; /// -/// The options associated with the . +/// The options associated with the individual resilience strategy. /// public abstract class ResilienceStrategyOptions { diff --git a/src/Polly.Core/ResilienceStrategyT.cs b/src/Polly.Core/ResilienceStrategyT.cs deleted file mode 100644 index a9119fb4901..00000000000 --- a/src/Polly.Core/ResilienceStrategyT.cs +++ /dev/null @@ -1,16 +0,0 @@ -namespace Polly; - -/// -/// Resilience strategy is used to execute the user-provided callbacks. -/// -/// The type of result this strategy supports. -/// -/// Resilience strategy supports various types of callbacks of result type -/// and provides a unified way to execute them. This includes overloads for synchronous and asynchronous callbacks. -/// -public partial class ResilienceStrategy -{ - internal ResilienceStrategy(ResilienceStrategy strategy) => Strategy = strategy; - - internal ResilienceStrategy Strategy { get; } -} diff --git a/src/Polly.Core/Retry/RetryCompositeStrategyBuilderExtensions.cs b/src/Polly.Core/Retry/RetryResiliencePipelineBuilderExtensions.cs similarity index 72% rename from src/Polly.Core/Retry/RetryCompositeStrategyBuilderExtensions.cs rename to src/Polly.Core/Retry/RetryResiliencePipelineBuilderExtensions.cs index 716204d1bb3..6d77c91be8d 100644 --- a/src/Polly.Core/Retry/RetryCompositeStrategyBuilderExtensions.cs +++ b/src/Polly.Core/Retry/RetryResiliencePipelineBuilderExtensions.cs @@ -5,15 +5,15 @@ namespace Polly; /// -/// Retry extension methods for the . +/// Extensions for adding retries to . /// -public static class RetryCompositeStrategyBuilderExtensions +public static class RetryResiliencePipelineBuilderExtensions { /// - /// Adds a retry strategy to the builder. + /// Adds a retry to the builder. /// /// The builder instance. - /// The retry strategy options. + /// The retry options. /// The builder instance with the retry strategy added. /// Thrown when or is . /// Thrown when are invalid. @@ -22,7 +22,7 @@ public static class RetryCompositeStrategyBuilderExtensions "IL2026:Members annotated with 'RequiresUnreferencedCodeAttribute' require dynamic access otherwise can break functionality when trimming application code", Justification = "All options members preserved.")] [DynamicDependency(DynamicallyAccessedMemberTypes.All, typeof(RetryStrategyOptions))] - public static CompositeStrategyBuilder AddRetry(this CompositeStrategyBuilder builder, RetryStrategyOptions options) + public static ResiliencePipelineBuilder AddRetry(this ResiliencePipelineBuilder builder, RetryStrategyOptions options) { Guard.NotNull(builder); Guard.NotNull(options); @@ -33,20 +33,20 @@ public static CompositeStrategyBuilder AddRetry(this CompositeStrategyBuilder bu } /// - /// Adds a retry strategy to the builder. + /// Adds a retry to the builder. /// - /// The type of result the retry strategy handles. + /// The type of result the retry handles. /// The builder instance. - /// The retry strategy options. - /// The builder instance with the retry strategy added. + /// The retry options. + /// The builder instance with the retry added. /// Thrown when or is . /// Thrown when are invalid. [UnconditionalSuppressMessage( "Trimming", "IL2026:Members annotated with 'RequiresUnreferencedCodeAttribute' require dynamic access otherwise can break functionality when trimming application code", Justification = "All options members preserved.")] - public static CompositeStrategyBuilder AddRetry<[DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.All)] TResult>( - this CompositeStrategyBuilder builder, + public static ResiliencePipelineBuilder AddRetry<[DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.All)] TResult>( + this ResiliencePipelineBuilder builder, RetryStrategyOptions options) { Guard.NotNull(builder); diff --git a/src/Polly.Core/Retry/RetryResilienceStrategy.cs b/src/Polly.Core/Retry/RetryResilienceStrategy.cs index 765b5843360..6d6c681accc 100644 --- a/src/Polly.Core/Retry/RetryResilienceStrategy.cs +++ b/src/Polly.Core/Retry/RetryResilienceStrategy.cs @@ -2,7 +2,7 @@ namespace Polly.Retry; -internal sealed class RetryResilienceStrategy : ReactiveResilienceStrategy +internal sealed class RetryResilienceStrategy : ResilienceStrategy { private readonly TimeProvider _timeProvider; private readonly ResilienceStrategyTelemetry _telemetry; diff --git a/src/Polly.Core/StrategyBuilderContext.cs b/src/Polly.Core/StrategyBuilderContext.cs index f0e65a2f608..d493c68c95e 100644 --- a/src/Polly.Core/StrategyBuilderContext.cs +++ b/src/Polly.Core/StrategyBuilderContext.cs @@ -2,8 +2,6 @@ namespace Polly; -#pragma warning disable S107 - /// /// The context used for building an individual resilience strategy. /// diff --git a/src/Polly.Core/Telemetry/ResilienceTelemetrySource.cs b/src/Polly.Core/Telemetry/ResilienceTelemetrySource.cs index 96b134fd002..f07bee2fc94 100644 --- a/src/Polly.Core/Telemetry/ResilienceTelemetrySource.cs +++ b/src/Polly.Core/Telemetry/ResilienceTelemetrySource.cs @@ -11,31 +11,31 @@ public sealed class ResilienceTelemetrySource /// /// Initializes a new instance of the class. /// - /// The builder name. - /// The builder instance name. + /// The pipeline name. + /// The pipeline instance name. /// The builder properties. /// The strategy name. public ResilienceTelemetrySource( - string? builderName, - string? builderInstanceName, + string? pipelineName, + string? pipelineInstanceName, ResilienceProperties builderProperties, string? strategyName) { - BuilderName = builderName; - BuilderInstanceName = builderInstanceName; + PipelineName = pipelineName; + PipelineInstanceName = pipelineInstanceName; BuilderProperties = builderProperties; StrategyName = strategyName; } /// - /// Gets the builder name. + /// Gets the pipeline name. /// - public string? BuilderName { get; } + public string? PipelineName { get; } /// - /// Gets the builder instance name. + /// Gets the pipeline instance name. /// - public string? BuilderInstanceName { get; } + public string? PipelineInstanceName { get; } /// /// Gets the builder properties. diff --git a/src/Polly.Core/Timeout/TimeoutCompositeStrategyBuilderExtensions.cs b/src/Polly.Core/Timeout/TimeoutResiliencePipelineBuilderExtensions.cs similarity index 85% rename from src/Polly.Core/Timeout/TimeoutCompositeStrategyBuilderExtensions.cs rename to src/Polly.Core/Timeout/TimeoutResiliencePipelineBuilderExtensions.cs index 4016efea388..2c97afe0864 100644 --- a/src/Polly.Core/Timeout/TimeoutCompositeStrategyBuilderExtensions.cs +++ b/src/Polly.Core/Timeout/TimeoutResiliencePipelineBuilderExtensions.cs @@ -5,12 +5,12 @@ namespace Polly; /// -/// Extension methods for adding timeouts to a . +/// Extensions for adding timeout to . /// -public static class TimeoutCompositeStrategyBuilderExtensions +public static class TimeoutResiliencePipelineBuilderExtensions { /// - /// Adds a timeout resilience strategy to the builder. + /// Adds a timeout to the builder. /// /// The builder type. /// The builder instance. @@ -19,7 +19,7 @@ public static class TimeoutCompositeStrategyBuilderExtensions /// Thrown when is . /// Thrown when the options produced from the arguments are invalid. public static TBuilder AddTimeout(this TBuilder builder, TimeSpan timeout) - where TBuilder : CompositeStrategyBuilderBase + where TBuilder : ResiliencePipelineBuilderBase { Guard.NotNull(builder); @@ -30,7 +30,7 @@ public static TBuilder AddTimeout(this TBuilder builder, TimeSpan time } /// - /// Adds a timeout resilience strategy to the builder. + /// Adds a timeout to the builder. /// /// The builder type. /// The builder instance. @@ -44,7 +44,7 @@ public static TBuilder AddTimeout(this TBuilder builder, TimeSpan time "IL2026:Members annotated with 'RequiresUnreferencedCodeAttribute' require dynamic access otherwise can break functionality when trimming application code", Justification = "All options members preserved.")] public static TBuilder AddTimeout(this TBuilder builder, TimeoutStrategyOptions options) - where TBuilder : CompositeStrategyBuilderBase + where TBuilder : ResiliencePipelineBuilderBase { Guard.NotNull(builder); Guard.NotNull(options); diff --git a/src/Polly.Core/Timeout/TimeoutResilienceStrategy.cs b/src/Polly.Core/Timeout/TimeoutResilienceStrategy.cs index 0fb5cac03bf..eb3e3bf1a6b 100644 --- a/src/Polly.Core/Timeout/TimeoutResilienceStrategy.cs +++ b/src/Polly.Core/Timeout/TimeoutResilienceStrategy.cs @@ -2,7 +2,7 @@ namespace Polly.Timeout; -internal sealed class TimeoutResilienceStrategy : NonReactiveResilienceStrategy +internal sealed class TimeoutResilienceStrategy : ResilienceStrategy { private readonly ResilienceStrategyTelemetry _telemetry; private readonly CancellationTokenSourcePool _cancellationTokenSourcePool; diff --git a/src/Polly.Core/Utils/CompositeResiliencePipeline.DebuggerProxy.cs b/src/Polly.Core/Utils/CompositeResiliencePipeline.DebuggerProxy.cs new file mode 100644 index 00000000000..57cbde31478 --- /dev/null +++ b/src/Polly.Core/Utils/CompositeResiliencePipeline.DebuggerProxy.cs @@ -0,0 +1,14 @@ +namespace Polly.Utils; + +internal partial class CompositeResiliencePipeline +{ + internal sealed class DebuggerProxy + { + private readonly CompositeResiliencePipeline _pipeline; + + public DebuggerProxy(CompositeResiliencePipeline pipeline) => _pipeline = pipeline; + + [DebuggerBrowsable(DebuggerBrowsableState.RootHidden)] + public IEnumerable Strategies => _pipeline.Strategies; + } +} diff --git a/src/Polly.Core/Utils/CompositeResilienceStrategy.cs b/src/Polly.Core/Utils/CompositeResiliencePipeline.cs similarity index 79% rename from src/Polly.Core/Utils/CompositeResilienceStrategy.cs rename to src/Polly.Core/Utils/CompositeResiliencePipeline.cs index 0c5508c6c35..15a0cc51e4e 100644 --- a/src/Polly.Core/Utils/CompositeResilienceStrategy.cs +++ b/src/Polly.Core/Utils/CompositeResiliencePipeline.cs @@ -7,15 +7,15 @@ namespace Polly.Utils; /// /// A combination of multiple resilience strategies. /// -[DebuggerDisplay("CompositeResilienceStrategy, Strategies = {Strategies.Count}")] +[DebuggerDisplay("CompositeResiliencePipeline, Strategies = {Strategies.Count}")] [DebuggerTypeProxy(typeof(DebuggerProxy))] -internal sealed partial class CompositeResilienceStrategy : ResilienceStrategy +internal sealed partial class CompositeResiliencePipeline : ResiliencePipeline { - private readonly ResilienceStrategy _firstStrategy; + private readonly ResiliencePipeline _firstStrategy; private readonly ResilienceStrategyTelemetry _telemetry; private readonly TimeProvider _timeProvider; - public static CompositeResilienceStrategy Create(IReadOnlyList strategies, ResilienceStrategyTelemetry telemetry, TimeProvider timeProvider) + public static CompositeResiliencePipeline Create(IReadOnlyList strategies, ResilienceStrategyTelemetry telemetry, TimeProvider timeProvider) { Guard.NotNull(strategies); @@ -31,13 +31,13 @@ public static CompositeResilienceStrategy Create(IReadOnlyList new DelegatingResilienceStrategy(strategy)) + .Select(strategy => new DelegatingResiliencePipeline(strategy)) .ToList(); #if NET6_0_OR_GREATER @@ -53,10 +53,10 @@ public static CompositeResilienceStrategy Create(IReadOnlyList strategies, ResilienceStrategyTelemetry telemetry, TimeProvider timeProvider) + private CompositeResiliencePipeline(ResiliencePipeline first, IReadOnlyList strategies, ResilienceStrategyTelemetry telemetry, TimeProvider timeProvider) { Strategies = strategies; @@ -65,7 +65,7 @@ private CompositeResilienceStrategy(ResilienceStrategy first, IReadOnlyList Strategies { get; } + public IReadOnlyList Strategies { get; } internal override async ValueTask> ExecuteCore( Func>> callback, @@ -98,20 +98,20 @@ internal override async ValueTask> ExecuteCore /// /// A resilience strategy that delegates the execution to the next strategy in the chain. /// - private sealed class DelegatingResilienceStrategy : ResilienceStrategy + private sealed class DelegatingResiliencePipeline : ResiliencePipeline { - private readonly ResilienceStrategy _strategy; + private readonly ResiliencePipeline _pipeline; - public DelegatingResilienceStrategy(ResilienceStrategy strategy) => _strategy = strategy; + public DelegatingResiliencePipeline(ResiliencePipeline strategy) => _pipeline = strategy; - public ResilienceStrategy? Next { get; set; } + public ResiliencePipeline? Next { get; set; } internal override ValueTask> ExecuteCore( Func>> callback, ResilienceContext context, TState state) { - return _strategy.ExecuteCore( + return _pipeline.ExecuteCore( static (context, state) => { if (context.CancellationToken.IsCancellationRequested) diff --git a/src/Polly.Core/Utils/CompositeResilienceStrategy.DebuggerProxy.cs b/src/Polly.Core/Utils/CompositeResilienceStrategy.DebuggerProxy.cs deleted file mode 100644 index 8d93c4e20b6..00000000000 --- a/src/Polly.Core/Utils/CompositeResilienceStrategy.DebuggerProxy.cs +++ /dev/null @@ -1,14 +0,0 @@ -namespace Polly.Utils; - -internal partial class CompositeResilienceStrategy -{ - internal sealed class DebuggerProxy - { - private readonly CompositeResilienceStrategy _resilienceStrategy; - - public DebuggerProxy(CompositeResilienceStrategy resilienceStrategy) => _resilienceStrategy = resilienceStrategy; - - [DebuggerBrowsable(DebuggerBrowsableState.RootHidden)] - public IEnumerable Strategies => _resilienceStrategy.Strategies; - } -} diff --git a/src/Polly.Core/Utils/ReloadableResilienceStrategy.cs b/src/Polly.Core/Utils/ReloadableResiliencePipeline.cs similarity index 78% rename from src/Polly.Core/Utils/ReloadableResilienceStrategy.cs rename to src/Polly.Core/Utils/ReloadableResiliencePipeline.cs index 90dcd420582..7bdebdcb462 100644 --- a/src/Polly.Core/Utils/ReloadableResilienceStrategy.cs +++ b/src/Polly.Core/Utils/ReloadableResiliencePipeline.cs @@ -2,40 +2,40 @@ namespace Polly.Utils; -internal sealed class ReloadableResilienceStrategy : ResilienceStrategy +internal sealed class ReloadableResiliencePipeline : ResiliencePipeline { public const string ReloadFailedEvent = "ReloadFailed"; public const string OnReloadEvent = "OnReload"; private readonly Func _onReload; - private readonly Func _resilienceStrategyFactory; + private readonly Func _resiliencePipelineFactory; private readonly ResilienceStrategyTelemetry _telemetry; private CancellationTokenRegistration _registration; - public ReloadableResilienceStrategy( - ResilienceStrategy initialStrategy, + public ReloadableResiliencePipeline( + ResiliencePipeline initialPipeline, Func onReload, - Func resilienceStrategyFactory, + Func resiliencePipelineFactory, ResilienceStrategyTelemetry telemetry) { - Strategy = initialStrategy; + Pipeline = initialPipeline; _onReload = onReload; - _resilienceStrategyFactory = resilienceStrategyFactory; + _resiliencePipelineFactory = resiliencePipelineFactory; _telemetry = telemetry; RegisterOnReload(default); } - public ResilienceStrategy Strategy { get; private set; } + public ResiliencePipeline Pipeline { get; private set; } internal override ValueTask> ExecuteCore( Func>> callback, ResilienceContext context, TState state) { - return Strategy.ExecuteCore(callback, context, state); + return Pipeline.ExecuteCore(callback, context, state); } private void RegisterOnReload(CancellationToken previousToken) @@ -54,7 +54,7 @@ private void RegisterOnReload(CancellationToken previousToken) try { _telemetry.Report(new(ResilienceEventSeverity.Information, OnReloadEvent), context, new OnReloadArguments()); - Strategy = _resilienceStrategyFactory(); + Pipeline = _resiliencePipelineFactory(); } catch (Exception e) { diff --git a/src/Polly.Core/Utils/ReactiveResilienceStrategyBridge.cs b/src/Polly.Core/Utils/ResiliencePipelineBridge.TResult.cs similarity index 82% rename from src/Polly.Core/Utils/ReactiveResilienceStrategyBridge.cs rename to src/Polly.Core/Utils/ResiliencePipelineBridge.TResult.cs index c76d82fab4a..75581f215e8 100644 --- a/src/Polly.Core/Utils/ReactiveResilienceStrategyBridge.cs +++ b/src/Polly.Core/Utils/ResiliencePipelineBridge.TResult.cs @@ -1,11 +1,11 @@ namespace Polly.Utils; [DebuggerDisplay("{Strategy}")] -internal sealed class ReactiveResilienceStrategyBridge : ResilienceStrategy +internal sealed class ResiliencePipelineBridge : ResiliencePipeline { - public ReactiveResilienceStrategyBridge(ReactiveResilienceStrategy strategy) => Strategy = strategy; + public ResiliencePipelineBridge(ResilienceStrategy strategy) => Strategy = strategy; - public ReactiveResilienceStrategy Strategy { get; } + public ResilienceStrategy Strategy { get; } internal override ValueTask> ExecuteCore( Func>> callback, diff --git a/src/Polly.Core/Utils/NonReactiveResilienceStrategyBridge.cs b/src/Polly.Core/Utils/ResiliencePipelineBridge.cs similarity index 57% rename from src/Polly.Core/Utils/NonReactiveResilienceStrategyBridge.cs rename to src/Polly.Core/Utils/ResiliencePipelineBridge.cs index 82db403244d..eeeaf4af235 100644 --- a/src/Polly.Core/Utils/NonReactiveResilienceStrategyBridge.cs +++ b/src/Polly.Core/Utils/ResiliencePipelineBridge.cs @@ -1,11 +1,11 @@ namespace Polly.Utils; [DebuggerDisplay("{Strategy}")] -internal sealed class NonReactiveResilienceStrategyBridge : ResilienceStrategy +internal sealed class ResiliencePipelineBridge : ResiliencePipeline { - public NonReactiveResilienceStrategyBridge(NonReactiveResilienceStrategy strategy) => Strategy = strategy; + public ResiliencePipelineBridge(ResilienceStrategy strategy) => Strategy = strategy; - public NonReactiveResilienceStrategy Strategy { get; } + public ResilienceStrategy Strategy { get; } internal override ValueTask> ExecuteCore( Func>> callback, diff --git a/src/Polly.Extensions/DependencyInjection/AddResilienceStrategyContext.cs b/src/Polly.Extensions/DependencyInjection/AddResiliencePipelineContext.cs similarity index 88% rename from src/Polly.Extensions/DependencyInjection/AddResilienceStrategyContext.cs rename to src/Polly.Extensions/DependencyInjection/AddResiliencePipelineContext.cs index 9ee78b44a79..0fe9503a487 100644 --- a/src/Polly.Extensions/DependencyInjection/AddResilienceStrategyContext.cs +++ b/src/Polly.Extensions/DependencyInjection/AddResiliencePipelineContext.cs @@ -6,17 +6,17 @@ namespace Polly.DependencyInjection; /// -/// Represents the context for adding a resilience strategy with the specified key. +/// Represents the context for adding a resilience pipeline with the specified key. /// -/// The type of the key used to identify the resilience strategy. -public sealed class AddResilienceStrategyContext +/// The type of the key used to identify the resilience pipeline. +public sealed class AddResiliencePipelineContext where TKey : notnull { - internal AddResilienceStrategyContext(ConfigureBuilderContext registryContext, IServiceProvider serviceProvider) + internal AddResiliencePipelineContext(ConfigureBuilderContext registryContext, IServiceProvider serviceProvider) { RegistryContext = registryContext; ServiceProvider = serviceProvider; - StrategyKey = registryContext.StrategyKey; + PipelineKey = registryContext.PipelineKey; BuilderName = registryContext.BuilderName; } @@ -28,7 +28,7 @@ internal AddResilienceStrategyContext(ConfigureBuilderContext registryCont /// /// Gets the strategy key for the strategy being created. /// - public TKey StrategyKey { get; } + public TKey PipelineKey { get; } /// /// Gets the that provides access to the dependency injection container. @@ -41,7 +41,7 @@ internal AddResilienceStrategyContext(ConfigureBuilderContext registryCont internal ConfigureBuilderContext RegistryContext { get; } /// - /// Enables dynamic reloading of the resilience strategy whenever the options are changed. + /// Enables dynamic reloading of the resilience pipeline whenever the options are changed. /// /// The options type to listen to. /// The named options, if any. diff --git a/src/Polly.Extensions/DependencyInjection/ConfigureResiliencePipelineRegistryOptions.cs b/src/Polly.Extensions/DependencyInjection/ConfigureResiliencePipelineRegistryOptions.cs new file mode 100644 index 00000000000..83ecd3ffd0e --- /dev/null +++ b/src/Polly.Extensions/DependencyInjection/ConfigureResiliencePipelineRegistryOptions.cs @@ -0,0 +1,9 @@ +using Polly.Registry; + +namespace Polly.DependencyInjection; + +internal sealed class ConfigureResiliencePipelineRegistryOptions + where TKey : notnull +{ + public List>> Actions { get; } = new(); +} diff --git a/src/Polly.Extensions/DependencyInjection/ConfigureResilienceStrategyRegistryOptions.cs b/src/Polly.Extensions/DependencyInjection/ConfigureResilienceStrategyRegistryOptions.cs deleted file mode 100644 index e5533c53574..00000000000 --- a/src/Polly.Extensions/DependencyInjection/ConfigureResilienceStrategyRegistryOptions.cs +++ /dev/null @@ -1,9 +0,0 @@ -using Polly.Registry; - -namespace Polly.DependencyInjection; - -internal sealed class ConfigureResilienceStrategyRegistryOptions - where TKey : notnull -{ - public List>> Actions { get; } = new(); -} diff --git a/src/Polly.Extensions/DependencyInjection/PollyServiceCollectionExtensions.cs b/src/Polly.Extensions/DependencyInjection/PollyServiceCollectionExtensions.cs index 9d64f847777..280eaaaa663 100644 --- a/src/Polly.Extensions/DependencyInjection/PollyServiceCollectionExtensions.cs +++ b/src/Polly.Extensions/DependencyInjection/PollyServiceCollectionExtensions.cs @@ -11,67 +11,67 @@ namespace Polly; /// -/// Provides extension methods for registering resilience strategies using the . +/// Provides extension methods for registering resilience pipelines using the . /// public static class PollyServiceCollectionExtensions { /// - /// Adds a generic resilience strategy to service collection. + /// Adds a generic resilience pipeline to service collection. /// - /// The type of the key used to identify the resilience strategy. - /// The type of result that the resilience strategy handles. - /// The to add the resilience strategy to. - /// The key used to identify the resilience strategy. - /// An action that configures the resilience strategy. - /// The updated with the registered resilience strategy. - /// Thrown if the resilience strategy builder with the provided key has already been added to the registry. + /// The type of the key used to identify the resilience pipeline. + /// The type of result that the resilience pipeline handles. + /// The to add the resilience pipeline to. + /// The key used to identify the resilience pipeline. + /// An action that configures the resilience pipeline. + /// The updated with the registered resilience pipeline. + /// Thrown if the resilience pipeline builder with the provided key has already been added to the registry. /// Thrown when or is . /// - /// You can retrieve the registered strategy by resolving the class from the dependency injection container. + /// You can retrieve the registered pipeline by resolving the class from the dependency injection container. /// - /// This call enables the telemetry for the registered resilience strategy. + /// This call enables the telemetry for the registered resilience pipeline. /// /// - public static IServiceCollection AddResilienceStrategy( + public static IServiceCollection AddResiliencePipeline( this IServiceCollection services, TKey key, - Action> configure) + Action> configure) where TKey : notnull { Guard.NotNull(services); Guard.NotNull(configure); - return services.AddResilienceStrategy(key, (builder, _) => configure(builder)); + return services.AddResiliencePipeline(key, (builder, _) => configure(builder)); } /// - /// Adds a generic resilience strategy to service collection. + /// Adds a generic resilience pipeline to service collection. /// - /// The type of the key used to identify the resilience strategy. - /// The type of result that the resilience strategy handles. - /// The to add the resilience strategy to. - /// The key used to identify the resilience strategy. - /// An action that configures the resilience strategy. - /// The updated with the registered resilience strategy. - /// Thrown if the resilience strategy builder with the provided key has already been added to the registry. + /// The type of the key used to identify the resilience pipeline. + /// The type of result that the resilience pipeline handles. + /// The to add the resilience pipeline to. + /// The key used to identify the resilience pipeline. + /// An action that configures the resilience pipeline. + /// The updated with the registered resilience pipeline. + /// Thrown if the resilience pipeline builder with the provided key has already been added to the registry. /// Thrown when or is . /// - /// You can retrieve the registered strategy by resolving the class from the dependency injection container. + /// You can retrieve the registered pipeline by resolving the class from the dependency injection container. /// - /// This call enables the telemetry for the registered resilience strategy. + /// This call enables the telemetry for the registered resilience pipeline. /// /// - public static IServiceCollection AddResilienceStrategy( + public static IServiceCollection AddResiliencePipeline( this IServiceCollection services, TKey key, - Action, AddResilienceStrategyContext> configure) + Action, AddResiliencePipelineContext> configure) where TKey : notnull { Guard.NotNull(services); Guard.NotNull(configure); services - .AddOptions>() + .AddOptions>() .Configure((options, serviceProvider) => { options.Actions.Add((registry) => @@ -80,69 +80,69 @@ public static IServiceCollection AddResilienceStrategy( registry.RemoveBuilder(key); registry.TryAddBuilder(key, (builder, context) => { - configure(builder, new AddResilienceStrategyContext(context, serviceProvider)); + configure(builder, new AddResiliencePipelineContext(context, serviceProvider)); }); }); }); - return services.AddResilienceStrategyRegistry(); + return services.AddResiliencePipelineRegistry(); } /// - /// Adds a resilience strategy to service collection. + /// Adds a resilience pipeline to service collection. /// - /// The type of the key used to identify the resilience strategy. - /// The to add the resilience strategy to. - /// The key used to identify the resilience strategy. - /// An action that configures the resilience strategy. - /// The updated with the registered resilience strategy. - /// Thrown if the resilience strategy builder with the provided key has already been added to the registry. + /// The type of the key used to identify the resilience pipeline. + /// The to add the resilience pipeline to. + /// The key used to identify the resilience pipeline. + /// An action that configures the resilience pipeline. + /// The updated with the registered resilience pipeline. + /// Thrown if the resilience pipeline builder with the provided key has already been added to the registry. /// Thrown when or is . /// - /// You can retrieve the registered strategy by resolving the class from the dependency injection container. + /// You can retrieve the registered pipeline by resolving the class from the dependency injection container. /// - /// This call enables the telemetry for the registered resilience strategy. + /// This call enables the telemetry for the registered resilience pipeline. /// /// - public static IServiceCollection AddResilienceStrategy( + public static IServiceCollection AddResiliencePipeline( this IServiceCollection services, TKey key, - Action configure) + Action configure) where TKey : notnull { Guard.NotNull(services); Guard.NotNull(configure); - return services.AddResilienceStrategy(key, (builder, _) => configure(builder)); + return services.AddResiliencePipeline(key, (builder, _) => configure(builder)); } /// - /// Adds a resilience strategy to service collection. + /// Adds a resilience pipeline to service collection. /// - /// The type of the key used to identify the resilience strategy. - /// The to add the resilience strategy to. - /// The key used to identify the resilience strategy. - /// An action that configures the resilience strategy. - /// The updated with the registered resilience strategy. - /// Thrown if the resilience strategy builder with the provided key has already been added to the registry. + /// The type of the key used to identify the resilience pipeline. + /// The to add the resilience pipeline to. + /// The key used to identify the resilience pipeline. + /// An action that configures the resilience pipeline. + /// The updated with the registered resilience pipeline. + /// Thrown if the resilience pipeline builder with the provided key has already been added to the registry. /// Thrown when or is . /// - /// You can retrieve the registered strategy by resolving the class from the dependency injection container. + /// You can retrieve the registered pipeline by resolving the class from the dependency injection container. /// - /// This call enables the telemetry for the registered resilience strategy. + /// This call enables the telemetry for the registered resilience pipeline. /// /// - public static IServiceCollection AddResilienceStrategy( + public static IServiceCollection AddResiliencePipeline( this IServiceCollection services, TKey key, - Action> configure) + Action> configure) where TKey : notnull { Guard.NotNull(services); Guard.NotNull(configure); services - .AddOptions>() + .AddOptions>() .Configure((options, serviceProvider) => { options.Actions.Add((registry) => @@ -151,52 +151,52 @@ public static IServiceCollection AddResilienceStrategy( registry.RemoveBuilder(key); registry.TryAddBuilder(key, (builder, context) => { - configure(builder, new AddResilienceStrategyContext(context, serviceProvider)); + configure(builder, new AddResiliencePipelineContext(context, serviceProvider)); }); }); }); - return services.AddResilienceStrategyRegistry(); + return services.AddResiliencePipelineRegistry(); } /// - /// Adds and that allows configuring - /// and retrieving resilience strategies using the key. + /// Adds and that allows configuring + /// and retrieving resilience pipelines using the key. /// - /// The type of the key used to identify the resilience strategy. - /// The to add the resilience strategy to. - /// The action that configures the that are used by the registry. + /// The type of the key used to identify the resilience pipeline. + /// The to add the resilience pipeline to. + /// The action that configures the that are used by the registry. /// The updated with additional services added. /// Thrown when is . /// - /// This call enables telemetry for all resilience strategies created using . + /// This call enables telemetry for all resilience pipelines created using . /// - public static IServiceCollection AddResilienceStrategyRegistry( + public static IServiceCollection AddResiliencePipelineRegistry( this IServiceCollection services, - Action> configure) + Action> configure) where TKey : notnull { Guard.NotNull(services); Guard.NotNull(configure); - services.AddResilienceStrategyRegistry(); + services.AddResiliencePipelineRegistry(); services.Configure(configure); return services; } /// - /// Adds and that allows configuring - /// and retrieving resilience strategies using the key. + /// Adds and that allows configuring + /// and retrieving resilience pipelines using the key. /// - /// The type of the key used to identify the resilience strategy. - /// The to add the resilience strategy to. + /// The type of the key used to identify the resilience pipeline. + /// The to add the resilience pipeline to. /// The updated with additional services added. /// Thrown when is . /// - /// This call enables telemetry for all resilience strategies created using . + /// This call enables telemetry for all resilience pipelines created using . /// - public static IServiceCollection AddResilienceStrategyRegistry(this IServiceCollection services) + public static IServiceCollection AddResiliencePipelineRegistry(this IServiceCollection services) where TKey : notnull { Guard.NotNull(services); @@ -210,13 +210,13 @@ public static IServiceCollection AddResilienceStrategyRegistry(this IServi services.AddOptions(); services.Add(RegistryMarker.ServiceDescriptor); - services.AddCompositeStrategyBuilder(); + services.AddResiliencePipelineBuilder(); services.TryAddSingleton(serviceProvider => { - var options = serviceProvider.GetRequiredService>>().Value; - var configureActions = serviceProvider.GetRequiredService>>().Value.Actions; - var registry = new ResilienceStrategyRegistry(options); + var options = serviceProvider.GetRequiredService>>().Value; + var configureActions = serviceProvider.GetRequiredService>>().Value.Actions; + var registry = new ResiliencePipelineRegistry(options); foreach (var entry in configureActions) { @@ -226,20 +226,20 @@ public static IServiceCollection AddResilienceStrategyRegistry(this IServi return registry; }); - services.TryAddSingleton>(serviceProvider => serviceProvider.GetRequiredService>()); + services.TryAddSingleton>(serviceProvider => serviceProvider.GetRequiredService>()); // configure options services - .AddOptions>() + .AddOptions>() .Configure((options, serviceProvider) => { - options.BuilderFactory = () => serviceProvider.GetRequiredService(); + options.BuilderFactory = () => serviceProvider.GetRequiredService(); }); return services; } - private static void AddCompositeStrategyBuilder(this IServiceCollection services) + private static void AddResiliencePipelineBuilder(this IServiceCollection services) { services .AddOptions() @@ -250,7 +250,7 @@ private static void AddCompositeStrategyBuilder(this IServiceCollection services services.TryAddTransient(serviceProvider => { - var builder = new CompositeStrategyBuilder(); + var builder = new ResiliencePipelineBuilder(); builder.Properties.Set(PollyDependencyInjectionKeys.ServiceProvider, serviceProvider); builder.ConfigureTelemetry(serviceProvider.GetRequiredService>().Value); return builder; diff --git a/src/Polly.Extensions/PublicAPI.Unshipped.txt b/src/Polly.Extensions/PublicAPI.Unshipped.txt index d5dff8c1eef..1431166ab73 100644 --- a/src/Polly.Extensions/PublicAPI.Unshipped.txt +++ b/src/Polly.Extensions/PublicAPI.Unshipped.txt @@ -1,10 +1,10 @@ #nullable enable -Polly.DependencyInjection.AddResilienceStrategyContext -Polly.DependencyInjection.AddResilienceStrategyContext.BuilderName.get -> string! -Polly.DependencyInjection.AddResilienceStrategyContext.EnableReloads(string? name = null) -> void -Polly.DependencyInjection.AddResilienceStrategyContext.GetOptions(string? name = null) -> TOptions -Polly.DependencyInjection.AddResilienceStrategyContext.ServiceProvider.get -> System.IServiceProvider! -Polly.DependencyInjection.AddResilienceStrategyContext.StrategyKey.get -> TKey +Polly.DependencyInjection.AddResiliencePipelineContext +Polly.DependencyInjection.AddResiliencePipelineContext.BuilderName.get -> string! +Polly.DependencyInjection.AddResiliencePipelineContext.EnableReloads(string? name = null) -> void +Polly.DependencyInjection.AddResiliencePipelineContext.GetOptions(string? name = null) -> TOptions +Polly.DependencyInjection.AddResiliencePipelineContext.ServiceProvider.get -> System.IServiceProvider! +Polly.DependencyInjection.AddResiliencePipelineContext.PipelineKey.get -> TKey Polly.PollyServiceCollectionExtensions Polly.Registry.ConfigureBuilderContextExtensions Polly.Telemetry.EnrichmentContext @@ -21,13 +21,13 @@ Polly.Telemetry.TelemetryOptions.OnTelemetryEvent.set -> void Polly.Telemetry.TelemetryOptions.ResultFormatter.get -> System.Func! Polly.Telemetry.TelemetryOptions.ResultFormatter.set -> void Polly.Telemetry.TelemetryOptions.TelemetryOptions() -> void -Polly.TelemetryCompositeStrategyBuilderExtensions -static Polly.PollyServiceCollectionExtensions.AddResilienceStrategy(this Microsoft.Extensions.DependencyInjection.IServiceCollection! services, TKey key, System.Action!, Polly.DependencyInjection.AddResilienceStrategyContext!>! configure) -> Microsoft.Extensions.DependencyInjection.IServiceCollection! -static Polly.PollyServiceCollectionExtensions.AddResilienceStrategy(this Microsoft.Extensions.DependencyInjection.IServiceCollection! services, TKey key, System.Action!>! configure) -> Microsoft.Extensions.DependencyInjection.IServiceCollection! -static Polly.PollyServiceCollectionExtensions.AddResilienceStrategy(this Microsoft.Extensions.DependencyInjection.IServiceCollection! services, TKey key, System.Action!>! configure) -> Microsoft.Extensions.DependencyInjection.IServiceCollection! -static Polly.PollyServiceCollectionExtensions.AddResilienceStrategy(this Microsoft.Extensions.DependencyInjection.IServiceCollection! services, TKey key, System.Action! configure) -> Microsoft.Extensions.DependencyInjection.IServiceCollection! -static Polly.PollyServiceCollectionExtensions.AddResilienceStrategyRegistry(this Microsoft.Extensions.DependencyInjection.IServiceCollection! services) -> Microsoft.Extensions.DependencyInjection.IServiceCollection! -static Polly.PollyServiceCollectionExtensions.AddResilienceStrategyRegistry(this Microsoft.Extensions.DependencyInjection.IServiceCollection! services, System.Action!>! configure) -> Microsoft.Extensions.DependencyInjection.IServiceCollection! +Polly.TelemetryResiliencePipelineBuilderExtensions +static Polly.PollyServiceCollectionExtensions.AddResiliencePipeline(this Microsoft.Extensions.DependencyInjection.IServiceCollection! services, TKey key, System.Action!, Polly.DependencyInjection.AddResiliencePipelineContext!>! configure) -> Microsoft.Extensions.DependencyInjection.IServiceCollection! +static Polly.PollyServiceCollectionExtensions.AddResiliencePipeline(this Microsoft.Extensions.DependencyInjection.IServiceCollection! services, TKey key, System.Action!>! configure) -> Microsoft.Extensions.DependencyInjection.IServiceCollection! +static Polly.PollyServiceCollectionExtensions.AddResiliencePipeline(this Microsoft.Extensions.DependencyInjection.IServiceCollection! services, TKey key, System.Action!>! configure) -> Microsoft.Extensions.DependencyInjection.IServiceCollection! +static Polly.PollyServiceCollectionExtensions.AddResiliencePipeline(this Microsoft.Extensions.DependencyInjection.IServiceCollection! services, TKey key, System.Action! configure) -> Microsoft.Extensions.DependencyInjection.IServiceCollection! +static Polly.PollyServiceCollectionExtensions.AddResiliencePipelineRegistry(this Microsoft.Extensions.DependencyInjection.IServiceCollection! services) -> Microsoft.Extensions.DependencyInjection.IServiceCollection! +static Polly.PollyServiceCollectionExtensions.AddResiliencePipelineRegistry(this Microsoft.Extensions.DependencyInjection.IServiceCollection! services, System.Action!>! configure) -> Microsoft.Extensions.DependencyInjection.IServiceCollection! static Polly.Registry.ConfigureBuilderContextExtensions.EnableReloads(this Polly.Registry.ConfigureBuilderContext! context, Microsoft.Extensions.Options.IOptionsMonitor! optionsMonitor, string? name = null) -> void -static Polly.TelemetryCompositeStrategyBuilderExtensions.ConfigureTelemetry(this TBuilder! builder, Microsoft.Extensions.Logging.ILoggerFactory! loggerFactory) -> TBuilder! -static Polly.TelemetryCompositeStrategyBuilderExtensions.ConfigureTelemetry(this TBuilder! builder, Polly.Telemetry.TelemetryOptions! options) -> TBuilder! +static Polly.TelemetryResiliencePipelineBuilderExtensions.ConfigureTelemetry(this TBuilder! builder, Microsoft.Extensions.Logging.ILoggerFactory! loggerFactory) -> TBuilder! +static Polly.TelemetryResiliencePipelineBuilderExtensions.ConfigureTelemetry(this TBuilder! builder, Polly.Telemetry.TelemetryOptions! options) -> TBuilder! diff --git a/src/Polly.Extensions/README.md b/src/Polly.Extensions/README.md index 839d3862a41..7e587f9d07f 100644 --- a/src/Polly.Extensions/README.md +++ b/src/Polly.Extensions/README.md @@ -1,6 +1,6 @@ # Polly.Extensions Overview -`Polly.Extensions` provides a set of features that streamline the integration of Polly with the standard `IServiceCollection` Dependency Injection (DI) container. It further enhances telemetry by exposing a `ConfigureTelemetry` extension method that enables [logging](https://learn.microsoft.com/dotnet/core/extensions/logging?tabs=command-line) and [metering](https://learn.microsoft.com/dotnet/core/diagnostics/metrics) for all strategies created via DI extension points. Note that telemetry is enabled by default when utilizing the `AddResilienceStrategy` extension method. +`Polly.Extensions` provides a set of features that streamline the integration of Polly with the standard `IServiceCollection` Dependency Injection (DI) container. It further enhances telemetry by exposing a `ConfigureTelemetry` extension method that enables [logging](https://learn.microsoft.com/dotnet/core/extensions/logging?tabs=command-line) and [metering](https://learn.microsoft.com/dotnet/core/diagnostics/metrics) for all strategies created via DI extension points. Note that telemetry is enabled by default when utilizing the `AddResiliencePipeline` extension method. Below is an example illustrating these capabilities: @@ -8,12 +8,12 @@ Below is an example illustrating these capabilities: var services = new ServiceCollection(); // Define a strategy -services.AddResilienceStrategy( +services.AddResiliencePipeline( "my-key", context => context.Builder.AddTimeout(TimeSpan.FromSeconds(10))); // Define a strategy with custom options -services.AddResilienceStrategy( +services.AddResiliencePipeline( "my-timeout", context => { @@ -23,8 +23,8 @@ services.AddResilienceStrategy( // Utilize the strategy var serviceProvider = services.BuildServiceProvider(); -var strategyProvider = serviceProvider.GetRequiredService>(); -var resilienceStrategy = strategyProvider.Get("my-key"); +var strategyProvider = serviceProvider.GetRequiredService>(); +var ResiliencePipeline = strategyProvider.Get("my-key"); ``` ## Telemetry Features @@ -49,18 +49,18 @@ telemetryOptions.OnTelemetryEvent = args => Console.WriteLine($"Telemetry event occurred: {args.Event.EventName}"); }); -var builder = new CompositeStrategyBuilder() +var builder = new ResiliencePipelineBuilder() .AddTimeout(TimeSpan.FromSeconds(1)) .ConfigureTelemetry(telemetryOptions) // This method enables telemetry in the builder .Build(); ``` -Alternatively, you can use the `AddResilienceStrategy` extension which automatically adds telemetry: +Alternatively, you can use the `AddResiliencePipeline` extension which automatically adds telemetry: ``` csharp var serviceCollection = new ServiceCollection() .AddLogging(builder => builder.AddConsole()) - .AddResilienceStrategy("my-strategy", builder => builder.AddTimeout(TimeSpan.FromSeconds(1))) + .AddResiliencePipeline("my-strategy", builder => builder.AddTimeout(TimeSpan.FromSeconds(1))) // Configure the default settings for TelemetryOptions .Configure(options => { @@ -90,8 +90,8 @@ Dimensions: |---| ---| |`event-name`| The name of the emitted event.| |`event-severity`| The severity of the event (`Debug`, `Information`, `Warning`, `Error`, `Critical`).| -|`builder-name`| The name of the builder corresponding to the resilience strategy.| -|`builder-instance`| The instance name of the builder corresponding to the resilience strategy.| +|`pipeline-name`| The name of the pipeline corresponding to the resilience pipeline.| +|`pipeline-instance`| The instance name of the pipeline corresponding to the resilience pipeline.| |`strategy-name`| The name of the strategy generating this event.| |`operation-key`| The operation key associated with the call site. | |`result-type`| The result type (`string`, `HttpResponseMessage`). | @@ -109,8 +109,8 @@ Dimensions: |---| ---| |`event-name`| The name of the emitted event.| |`event-severity`| The severity of the event (`Debug`, `Information`, `Warning`, `Error`, `Critical`).| -|`builder-name`| The name of the builder corresponding to the resilience strategy.| -|`builder-instance`| The instance name of the builder corresponding to the resilience strategy.| +|`pipeline-name`| The name of the pipeline corresponding to the resilience pipeline.| +|`pipeline-instance`| The instance name of the pipeline corresponding to the resilience pipeline.| |`strategy-name`| The name of the strategy generating this event.| |`operation-key`| The operation key associated with the call site. | |`result-type`| The result type (`string`, `HttpResponseMessage`). | @@ -128,8 +128,8 @@ Dimensions: |Name|Description| |---| ---| -|`builder-name`| The name of the builder corresponding to the resilience strategy.| -|`builder-instance`| The instance name of the builder corresponding to the resilience strategy.| +|`pipeline-name`| The name of the pipeline corresponding to the resilience pipeline.| +|`pipeline-instance`| The instance name of the pipeline corresponding to the resilience pipeline.| |`operation-key`| The operation key associated with the call site. | |`result-type`| The result type (`string`, `HttpResponseMessage`). | |`exception-name`| The full name of the exception assigned to the execution result (`System.InvalidOperationException`). | @@ -143,11 +143,11 @@ Logs are registered under the `Polly` logger name. Here are some examples of the // This log is recorded whenever a resilience event occurs. EventId = 0 Resilience event occurred. EventName: '{EventName}', Source: '{BuilderName}[{BuilderInstance}]/{StrategyType}[{StrategyName}]', Operation Key: '{OperationKey}', Result: '{Result}' -// This log is recorded when a resilience strategy begins executing. EventId = 1 -Resilience strategy executing. Source: '{BuilderName}[{BuilderInstance}]', Operation Key: '{OperationKey}', Result Type: '{ResultType}' +// This log is recorded when a resilience pipeline begins executing. EventId = 1 +Resilience pipeline executing. Source: '{BuilderName}[{BuilderInstance}]', Operation Key: '{OperationKey}', Result Type: '{ResultType}' -// This log is recorded when a resilience strategy finishes execution. EventId = 2 -Resilience strategy executed. Source: '{BuilderName}[{BuilderInstance}]', Operation Key: '{OperationKey}', Result Type: '{ResultType}', Result: '{Result}', Execution Health: '{ExecutionHealth}', Execution Time: {ExecutionTime}ms +// This log is recorded when a resilience pipeline finishes execution. EventId = 2 +Resilience pipeline executed. Source: '{BuilderName}[{BuilderInstance}]', Operation Key: '{OperationKey}', Result Type: '{ResultType}', Result: '{Result}', Execution Health: '{ExecutionHealth}', Execution Time: {ExecutionTime}ms // This log is recorded upon the completion of every execution attempt. EventId = 3 Execution attempt. Source: '{BuilderName}[{BuilderInstance}]/{StrategyType}[{StrategyName}]', Operation Key: '{OperationKey}', Result: '{Result}', Handled: '{Handled}', Attempt: '{Attempt}', Execution Time: '{ExecutionTimeMs}' diff --git a/src/Polly.Extensions/Registry/ConfigureBuilderContextExtensions.cs b/src/Polly.Extensions/Registry/ConfigureBuilderContextExtensions.cs index 6a09b0a57d1..c1df328ac88 100644 --- a/src/Polly.Extensions/Registry/ConfigureBuilderContextExtensions.cs +++ b/src/Polly.Extensions/Registry/ConfigureBuilderContextExtensions.cs @@ -10,9 +10,9 @@ namespace Polly.Registry; public static class ConfigureBuilderContextExtensions { /// - /// Enables dynamic reloading of the resilience strategy whenever the options are changed. + /// Enables dynamic reloading of the resilience pipeline whenever the options are changed. /// - /// The type of the key used to identify the resilience strategy. + /// The type of the key used to identify the resilience pipeline. /// The options type to listen to. /// The builder context. /// The options monitor. diff --git a/src/Polly.Extensions/Telemetry/Log.cs b/src/Polly.Extensions/Telemetry/Log.cs index e859ba5d824..6f462f32da2 100644 --- a/src/Polly.Extensions/Telemetry/Log.cs +++ b/src/Polly.Extensions/Telemetry/Log.cs @@ -30,12 +30,12 @@ public static partial void ResilienceEvent( [LoggerMessage( 1, LogLevel.Debug, - "Resilience strategy executing. " + + "Resilience pipeline executing. " + "Source: '{BuilderName}/{BuilderInstance}', " + "Operation Key: '{OperationKey}', " + "Result Type: '{ResultType}'", EventName = "StrategyExecuting")] - public static partial void ExecutingStrategy( + public static partial void PipelineExecuting( this ILogger logger, string builderName, string builderInstance, @@ -44,7 +44,7 @@ public static partial void ExecutingStrategy( [LoggerMessage( EventId = 2, - Message = "Resilience strategy executed. " + + Message = "Resilience pipeline executed. " + "Source: '{BuilderName}/{BuilderInstance}', " + "Operation Key: '{OperationKey}', " + "Result Type: '{ResultType}', " + @@ -52,7 +52,7 @@ public static partial void ExecutingStrategy( "Execution Health: '{ExecutionHealth}', " + "Execution Time: {ExecutionTime}ms", EventName = "StrategyExecuted")] - public static partial void StrategyExecuted( + public static partial void PipelineExecuted( this ILogger logger, LogLevel logLevel, string builderName, diff --git a/src/Polly.Extensions/Telemetry/ResilienceTelemetryDiagnosticSource.cs b/src/Polly.Extensions/Telemetry/ResilienceTelemetryDiagnosticSource.cs index 0e5e4ef7973..8584647da1b 100644 --- a/src/Polly.Extensions/Telemetry/ResilienceTelemetryDiagnosticSource.cs +++ b/src/Polly.Extensions/Telemetry/ResilienceTelemetryDiagnosticSource.cs @@ -64,14 +64,14 @@ private static void AddCommonTags(TelemetryEventArguments args, ResilienceTeleme enrichmentContext.Tags.Add(new(ResilienceTelemetryTags.EventName, args.Event.EventName)); enrichmentContext.Tags.Add(new(ResilienceTelemetryTags.EventSeverity, args.Event.Severity.AsString())); - if (source.BuilderName is not null) + if (source.PipelineName is not null) { - enrichmentContext.Tags.Add(new(ResilienceTelemetryTags.BuilderName, source.BuilderName)); + enrichmentContext.Tags.Add(new(ResilienceTelemetryTags.PipelineName, source.PipelineName)); } - if (source.BuilderInstanceName is not null) + if (source.PipelineInstanceName is not null) { - enrichmentContext.Tags.Add(new(ResilienceTelemetryTags.BuilderInstance, source.BuilderInstanceName)); + enrichmentContext.Tags.Add(new(ResilienceTelemetryTags.PipelineInstance, source.PipelineInstanceName)); } if (source.StrategyName is not null) @@ -152,9 +152,9 @@ private void LogEvent(TelemetryEventArguments args) if (args.Arguments is PipelineExecutingArguments pipelineExecutionStarted) { - _logger.ExecutingStrategy( - args.Source.BuilderName.GetValueOrPlaceholder(), - args.Source.BuilderInstanceName.GetValueOrPlaceholder(), + _logger.PipelineExecuting( + args.Source.PipelineName.GetValueOrPlaceholder(), + args.Source.PipelineInstanceName.GetValueOrPlaceholder(), args.Context.OperationKey, args.Context.GetResultType()); } @@ -162,10 +162,10 @@ private void LogEvent(TelemetryEventArguments args) { var logLevel = args.Context.IsExecutionHealthy() ? LogLevel.Debug : LogLevel.Warning; - _logger.StrategyExecuted( + _logger.PipelineExecuted( logLevel, - args.Source.BuilderName.GetValueOrPlaceholder(), - args.Source.BuilderInstanceName.GetValueOrPlaceholder(), + args.Source.PipelineName.GetValueOrPlaceholder(), + args.Source.PipelineInstanceName.GetValueOrPlaceholder(), args.Context.OperationKey, args.Context.GetResultType(), ExpandOutcome(args.Context, args.Outcome), @@ -179,8 +179,8 @@ private void LogEvent(TelemetryEventArguments args) { _logger.ExecutionAttempt( level, - args.Source.BuilderName.GetValueOrPlaceholder(), - args.Source.BuilderInstanceName.GetValueOrPlaceholder(), + args.Source.PipelineName.GetValueOrPlaceholder(), + args.Source.PipelineInstanceName.GetValueOrPlaceholder(), args.Source.StrategyName.GetValueOrPlaceholder(), args.Context.OperationKey, result, @@ -195,8 +195,8 @@ private void LogEvent(TelemetryEventArguments args) _logger.ResilienceEvent( level, args.Event.EventName, - args.Source.BuilderName.GetValueOrPlaceholder(), - args.Source.BuilderInstanceName.GetValueOrPlaceholder(), + args.Source.PipelineName.GetValueOrPlaceholder(), + args.Source.PipelineInstanceName.GetValueOrPlaceholder(), args.Source.StrategyName.GetValueOrPlaceholder(), args.Context.OperationKey, result, diff --git a/src/Polly.Extensions/Telemetry/ResilienceTelemetryTags.cs b/src/Polly.Extensions/Telemetry/ResilienceTelemetryTags.cs index b726af93346..672e4ed1fae 100644 --- a/src/Polly.Extensions/Telemetry/ResilienceTelemetryTags.cs +++ b/src/Polly.Extensions/Telemetry/ResilienceTelemetryTags.cs @@ -6,9 +6,9 @@ internal class ResilienceTelemetryTags public const string EventSeverity = "event-severity"; - public const string BuilderName = "builder-name"; + public const string PipelineName = "pipeline-name"; - public const string BuilderInstance = "builder-instance"; + public const string PipelineInstance = "pipeline-instance"; public const string StrategyName = "strategy-name"; diff --git a/src/Polly.Extensions/Telemetry/TelemetryCompositeStrategyBuilderExtensions.cs b/src/Polly.Extensions/Telemetry/TelemetryResiliencePipelineBuilderExtensions.cs similarity index 86% rename from src/Polly.Extensions/Telemetry/TelemetryCompositeStrategyBuilderExtensions.cs rename to src/Polly.Extensions/Telemetry/TelemetryResiliencePipelineBuilderExtensions.cs index 2888ac8e474..f65f396ea2e 100644 --- a/src/Polly.Extensions/Telemetry/TelemetryCompositeStrategyBuilderExtensions.cs +++ b/src/Polly.Extensions/Telemetry/TelemetryResiliencePipelineBuilderExtensions.cs @@ -6,9 +6,9 @@ namespace Polly; /// -/// The telemetry extensions for the . +/// The telemetry extensions for the . /// -public static class TelemetryCompositeStrategyBuilderExtensions +public static class TelemetryResiliencePipelineBuilderExtensions { /// /// Enables telemetry for this builder. @@ -18,12 +18,12 @@ public static class TelemetryCompositeStrategyBuilderExtensions /// The logger factory to be used for logging. /// The builder instance with the telemetry enabled. /// - /// By enabling telemetry, the resilience strategy will log and meter all resilience events. + /// By enabling telemetry, the resilience pipeline will log and meter all resilience events. /// Additionally, the telemetry strategy that logs and meters the executions is added to the beginning of the composite strategy. /// /// Thrown when or is . public static TBuilder ConfigureTelemetry(this TBuilder builder, ILoggerFactory loggerFactory) - where TBuilder : CompositeStrategyBuilderBase + where TBuilder : ResiliencePipelineBuilderBase { Guard.NotNull(builder); Guard.NotNull(loggerFactory); @@ -39,13 +39,13 @@ public static TBuilder ConfigureTelemetry(this TBuilder builder, ILogg /// The resilience telemetry options. /// The builder instance with the telemetry enabled. /// - /// By enabling telemetry, the resilience strategy will log and meter all resilience events. + /// By enabling telemetry, the resilience pipeline will log and meter all resilience events. /// Additionally, the telemetry strategy that logs and meters the executions is added to the beginning of the composite strategy. /// /// Thrown when or is . [DynamicDependency(DynamicallyAccessedMemberTypes.All, typeof(TelemetryOptions))] public static TBuilder ConfigureTelemetry(this TBuilder builder, TelemetryOptions options) - where TBuilder : CompositeStrategyBuilderBase + where TBuilder : ResiliencePipelineBuilderBase { Guard.NotNull(builder); Guard.NotNull(options); diff --git a/src/Polly.RateLimiting/PublicAPI.Unshipped.txt b/src/Polly.RateLimiting/PublicAPI.Unshipped.txt index 8b59d3bde84..6233ca0cf5d 100644 --- a/src/Polly.RateLimiting/PublicAPI.Unshipped.txt +++ b/src/Polly.RateLimiting/PublicAPI.Unshipped.txt @@ -1,5 +1,5 @@ #nullable enable -Polly.RateLimiterCompositeStrategyBuilderExtensions +Polly.RateLimiterResiliencePipelineBuilderExtensions Polly.RateLimiting.OnRateLimiterRejectedArguments Polly.RateLimiting.OnRateLimiterRejectedArguments.Context.get -> Polly.ResilienceContext! Polly.RateLimiting.OnRateLimiterRejectedArguments.Lease.get -> System.Threading.RateLimiting.RateLimitLease! @@ -22,11 +22,11 @@ Polly.RateLimiting.RateLimiterStrategyOptions.RateLimiter.get -> Polly.RateLimit Polly.RateLimiting.RateLimiterStrategyOptions.RateLimiter.set -> void Polly.RateLimiting.RateLimiterStrategyOptions.RateLimiterStrategyOptions() -> void Polly.RateLimiting.ResilienceRateLimiter +static Polly.RateLimiterResiliencePipelineBuilderExtensions.AddConcurrencyLimiter(this TBuilder! builder, int permitLimit, int queueLimit = 0) -> TBuilder! +static Polly.RateLimiterResiliencePipelineBuilderExtensions.AddConcurrencyLimiter(this TBuilder! builder, System.Threading.RateLimiting.ConcurrencyLimiterOptions! options) -> TBuilder! +static Polly.RateLimiterResiliencePipelineBuilderExtensions.AddRateLimiter(this TBuilder! builder, Polly.RateLimiting.RateLimiterStrategyOptions! options) -> TBuilder! +static Polly.RateLimiterResiliencePipelineBuilderExtensions.AddRateLimiter(this TBuilder! builder, System.Threading.RateLimiting.RateLimiter! limiter) -> TBuilder! Polly.RateLimiting.ResilienceRateLimiter.Dispose() -> void Polly.RateLimiting.ResilienceRateLimiter.DisposeAsync() -> System.Threading.Tasks.ValueTask -static Polly.RateLimiterCompositeStrategyBuilderExtensions.AddConcurrencyLimiter(this TBuilder! builder, int permitLimit, int queueLimit = 0) -> TBuilder! -static Polly.RateLimiterCompositeStrategyBuilderExtensions.AddConcurrencyLimiter(this TBuilder! builder, System.Threading.RateLimiting.ConcurrencyLimiterOptions! options) -> TBuilder! -static Polly.RateLimiterCompositeStrategyBuilderExtensions.AddRateLimiter(this TBuilder! builder, Polly.RateLimiting.RateLimiterStrategyOptions! options) -> TBuilder! -static Polly.RateLimiterCompositeStrategyBuilderExtensions.AddRateLimiter(this TBuilder! builder, System.Threading.RateLimiting.RateLimiter! limiter) -> TBuilder! static Polly.RateLimiting.ResilienceRateLimiter.Create(System.Threading.RateLimiting.PartitionedRateLimiter! rateLimiter) -> Polly.RateLimiting.ResilienceRateLimiter! static Polly.RateLimiting.ResilienceRateLimiter.Create(System.Threading.RateLimiting.RateLimiter! rateLimiter) -> Polly.RateLimiting.ResilienceRateLimiter! diff --git a/src/Polly.RateLimiting/RateLimiterCompositeStrategyBuilderExtensions.cs b/src/Polly.RateLimiting/RateLimiterResiliencePipelineBuilderExtensions.cs similarity index 85% rename from src/Polly.RateLimiting/RateLimiterCompositeStrategyBuilderExtensions.cs rename to src/Polly.RateLimiting/RateLimiterResiliencePipelineBuilderExtensions.cs index 9fd4b28c39d..c9dc9aeb86c 100644 --- a/src/Polly.RateLimiting/RateLimiterCompositeStrategyBuilderExtensions.cs +++ b/src/Polly.RateLimiting/RateLimiterResiliencePipelineBuilderExtensions.cs @@ -6,18 +6,18 @@ namespace Polly; /// -/// The rate limiter extensions for . +/// Extensions for adding rate limiting to . /// -public static class RateLimiterCompositeStrategyBuilderExtensions +public static class RateLimiterResiliencePipelineBuilderExtensions { /// - /// Adds the concurrency limiter strategy. + /// Adds the concurrency limiter. /// /// The builder type. /// The builder instance. /// Maximum number of permits that can be leased concurrently. /// Maximum number of permits that can be queued concurrently. - /// The builder instance with the concurrency limiter strategy added. + /// The builder instance with the concurrency limiter added. /// Thrown when is . /// Thrown when the options constructed from the arguments are invalid. /// Thrown when or is invalid. @@ -25,7 +25,7 @@ public static TBuilder AddConcurrencyLimiter( this TBuilder builder, int permitLimit, int queueLimit = 0) - where TBuilder : CompositeStrategyBuilderBase + where TBuilder : ResiliencePipelineBuilderBase { Guard.NotNull(builder); @@ -37,19 +37,19 @@ public static TBuilder AddConcurrencyLimiter( } /// - /// Adds the concurrency limiter strategy. + /// Adds the concurrency limiter. /// /// The builder type. /// The builder instance. /// The concurrency limiter options. - /// The builder instance with the concurrency limiter strategy added. + /// The builder instance with the concurrency limiter added. /// Thrown when or is . /// Thrown when the options constructed from the arguments are invalid. /// Thrown when are invalid. public static TBuilder AddConcurrencyLimiter( this TBuilder builder, ConcurrencyLimiterOptions options) - where TBuilder : CompositeStrategyBuilderBase + where TBuilder : ResiliencePipelineBuilderBase { Guard.NotNull(builder); Guard.NotNull(options); @@ -61,18 +61,18 @@ public static TBuilder AddConcurrencyLimiter( } /// - /// Adds the rate limiter strategy. + /// Adds the rate limiter. /// /// The builder type. /// The builder instance. /// The rate limiter to use. - /// The builder instance with the rate limiter strategy added. + /// The builder instance with the rate limiter added. /// Thrown when or is . /// Thrown when the options constructed from the arguments are invalid. public static TBuilder AddRateLimiter( this TBuilder builder, RateLimiter limiter) - where TBuilder : CompositeStrategyBuilderBase + where TBuilder : ResiliencePipelineBuilderBase { Guard.NotNull(builder); Guard.NotNull(limiter); @@ -84,12 +84,12 @@ public static TBuilder AddRateLimiter( } /// - /// Adds the rate limiter strategy. + /// Adds the rate limiter. /// /// The builder type. /// The builder instance. - /// The rate limiter strategy options. - /// The builder instance with the rate limiter strategy added. + /// The rate limiter options. + /// The builder instance with the rate limiter added. /// Thrown when or is . /// Thrown when are invalid. /// Thrown when for are invalid. @@ -101,7 +101,7 @@ public static TBuilder AddRateLimiter( public static TBuilder AddRateLimiter( this TBuilder builder, RateLimiterStrategyOptions options) - where TBuilder : CompositeStrategyBuilderBase + where TBuilder : ResiliencePipelineBuilderBase { Guard.NotNull(builder); Guard.NotNull(options); diff --git a/src/Polly.RateLimiting/RateLimiterResilienceStrategy.cs b/src/Polly.RateLimiting/RateLimiterResilienceStrategy.cs index e87120f188e..0508d2c9160 100644 --- a/src/Polly.RateLimiting/RateLimiterResilienceStrategy.cs +++ b/src/Polly.RateLimiting/RateLimiterResilienceStrategy.cs @@ -3,7 +3,7 @@ namespace Polly.RateLimiting; -internal sealed class RateLimiterResilienceStrategy : NonReactiveResilienceStrategy +internal sealed class RateLimiterResilienceStrategy : ResilienceStrategy { private readonly ResilienceStrategyTelemetry _telemetry; diff --git a/src/Polly.Testing/PublicAPI.Unshipped.txt b/src/Polly.Testing/PublicAPI.Unshipped.txt index 86b0886af86..77fb9c055a8 100644 --- a/src/Polly.Testing/PublicAPI.Unshipped.txt +++ b/src/Polly.Testing/PublicAPI.Unshipped.txt @@ -1,13 +1,13 @@ #nullable enable -Polly.Testing.InnerStrategiesDescriptor -Polly.Testing.InnerStrategiesDescriptor.FirstStrategy.get -> Polly.Testing.ResilienceStrategyDescriptor! -Polly.Testing.InnerStrategiesDescriptor.InnerStrategiesDescriptor(System.Collections.Generic.IReadOnlyList! strategies, bool isReloadable) -> void -Polly.Testing.InnerStrategiesDescriptor.IsReloadable.get -> bool -Polly.Testing.InnerStrategiesDescriptor.Strategies.get -> System.Collections.Generic.IReadOnlyList! +Polly.Testing.ResiliencePipelineDescriptor +Polly.Testing.ResiliencePipelineDescriptor.FirstStrategy.get -> Polly.Testing.ResilienceStrategyDescriptor! +Polly.Testing.ResiliencePipelineDescriptor.IsReloadable.get -> bool +Polly.Testing.ResiliencePipelineDescriptor.ResiliencePipelineDescriptor(System.Collections.Generic.IReadOnlyList! strategies, bool isReloadable) -> void +Polly.Testing.ResiliencePipelineDescriptor.Strategies.get -> System.Collections.Generic.IReadOnlyList! +Polly.Testing.ResiliencePipelineExtensions Polly.Testing.ResilienceStrategyDescriptor Polly.Testing.ResilienceStrategyDescriptor.Options.get -> Polly.ResilienceStrategyOptions? Polly.Testing.ResilienceStrategyDescriptor.ResilienceStrategyDescriptor(Polly.ResilienceStrategyOptions? options, object! strategyInstance) -> void Polly.Testing.ResilienceStrategyDescriptor.StrategyInstance.get -> object! -Polly.Testing.ResilienceStrategyExtensions -static Polly.Testing.ResilienceStrategyExtensions.GetInnerStrategies(this Polly.ResilienceStrategy! strategy) -> Polly.Testing.InnerStrategiesDescriptor! -static Polly.Testing.ResilienceStrategyExtensions.GetInnerStrategies(this Polly.ResilienceStrategy! strategy) -> Polly.Testing.InnerStrategiesDescriptor! +static Polly.Testing.ResiliencePipelineExtensions.GetPipelineDescriptor(this Polly.ResiliencePipeline! strategy) -> Polly.Testing.ResiliencePipelineDescriptor! +static Polly.Testing.ResiliencePipelineExtensions.GetPipelineDescriptor(this Polly.ResiliencePipeline! strategy) -> Polly.Testing.ResiliencePipelineDescriptor! diff --git a/src/Polly.Testing/README.md b/src/Polly.Testing/README.md index 6a474741700..1593b34f83c 100644 --- a/src/Polly.Testing/README.md +++ b/src/Polly.Testing/README.md @@ -1,10 +1,10 @@ # About Polly.Testing -This package exposes APIs and utilities that can be used to assert on the composition of resilience strategies. +This package exposes APIs and utilities that can be used to assert on the composition of resilience pipelines. ``` csharp -// Build your resilience strategy. -ResilienceStrategy strategy = new CompositeStrategyBuilder() +// Build your resilience pipeline. +ResiliencePipeline pipeline = new ResiliencePipelineBuilder() .AddRetry(new RetryStrategyOptions { RetryCount = 4 @@ -14,15 +14,14 @@ ResilienceStrategy strategy = new CompositeStrategyBuilder() .Build(); // Retrieve inner strategies. -InnerStrategiesDescriptor descriptor = strategy.GetInnerStrategies(); +ResiliencePipelineDescriptor descriptor = strategy.GetPipelineDescriptor(); // Assert the composition. -Assert.True(descriptor.HasTelemetry); Assert.Equal(2, descriptor.Strategies.Count); -var retryOptions = Assert.IsType(descriptor.Strategies[0]); +var retryOptions = Assert.IsType(descriptor.Strategies[0].Options); Assert.Equal(4, retryOptions.RetryCount); -var timeoutOptions = Assert.IsType(descriptor.Strategies[0]); +var timeoutOptions = Assert.IsType(descriptor.Strategies[0].Options); Assert.Equal(TimeSpan.FromSeconds(1), timeoutOptions.Timeout); ``` diff --git a/src/Polly.Testing/InnerStrategiesDescriptor.cs b/src/Polly.Testing/ResiliencePipelineDescriptor.cs similarity index 65% rename from src/Polly.Testing/InnerStrategiesDescriptor.cs rename to src/Polly.Testing/ResiliencePipelineDescriptor.cs index 7ada1a3d3de..0bc6da42666 100644 --- a/src/Polly.Testing/InnerStrategiesDescriptor.cs +++ b/src/Polly.Testing/ResiliencePipelineDescriptor.cs @@ -1,16 +1,16 @@ namespace Polly.Testing; /// -/// Describes the pipeline of a resilience strategy. +/// Describes the resilience pipeline. /// -public sealed class InnerStrategiesDescriptor +public sealed class ResiliencePipelineDescriptor { /// - /// Initializes a new instance of the class. + /// Initializes a new instance of the class. /// /// The strategies the pipeline is composed of. - /// Determines whether the resilience strategy is reloadable. - public InnerStrategiesDescriptor(IReadOnlyList strategies, bool isReloadable) + /// Determines whether the resilience pipeline is reloadable. + public ResiliencePipelineDescriptor(IReadOnlyList strategies, bool isReloadable) { Strategies = strategies; IsReloadable = isReloadable; @@ -27,7 +27,7 @@ public InnerStrategiesDescriptor(IReadOnlyList str public ResilienceStrategyDescriptor FirstStrategy => Strategies[0]; /// - /// Gets a value indicating whether the resilience strategy is reloadable. + /// Gets a value indicating whether the resilience pipeline is reloadable. /// public bool IsReloadable { get; } } diff --git a/src/Polly.Testing/ResilienceStrategyExtensions.cs b/src/Polly.Testing/ResiliencePipelineExtensions.cs similarity index 58% rename from src/Polly.Testing/ResilienceStrategyExtensions.cs rename to src/Polly.Testing/ResiliencePipelineExtensions.cs index 4b94b70933e..d4dc8c78c0c 100644 --- a/src/Polly.Testing/ResilienceStrategyExtensions.cs +++ b/src/Polly.Testing/ResiliencePipelineExtensions.cs @@ -3,9 +3,9 @@ namespace Polly.Testing; /// -/// The test-related extensions for and . +/// The test-related extensions for and . /// -public static class ResilienceStrategyExtensions +public static class ResiliencePipelineExtensions { /// /// Gets the inner strategies the is composed of. @@ -14,11 +14,11 @@ public static class ResilienceStrategyExtensions /// The strategy instance. /// A list of inner strategies. /// Thrown when is . - public static InnerStrategiesDescriptor GetInnerStrategies(this ResilienceStrategy strategy) + public static ResiliencePipelineDescriptor GetPipelineDescriptor(this ResiliencePipeline strategy) { Guard.NotNull(strategy); - return GetInnerStrategiesCore(strategy.Strategy); + return GetPipelineDescriptorCore(strategy.Strategy); } /// @@ -27,33 +27,33 @@ public static InnerStrategiesDescriptor GetInnerStrategies(this Resilie /// The strategy instance. /// A list of inner strategies. /// Thrown when is . - public static InnerStrategiesDescriptor GetInnerStrategies(this ResilienceStrategy strategy) + public static ResiliencePipelineDescriptor GetPipelineDescriptor(this ResiliencePipeline strategy) { Guard.NotNull(strategy); - return GetInnerStrategiesCore(strategy); + return GetPipelineDescriptorCore(strategy); } - private static InnerStrategiesDescriptor GetInnerStrategiesCore(ResilienceStrategy strategy) + private static ResiliencePipelineDescriptor GetPipelineDescriptorCore(ResiliencePipeline strategy) { - var strategies = new List(); + var strategies = new List(); strategy.ExpandStrategies(strategies); var innerStrategies = strategies.Select(s => new ResilienceStrategyDescriptor(s.Options, GetStrategyInstance(s))).ToList(); - return new InnerStrategiesDescriptor( + return new ResiliencePipelineDescriptor( innerStrategies.Where(s => !ShouldSkip(s.StrategyInstance)).ToList().AsReadOnly(), - isReloadable: innerStrategies.Exists(s => s.StrategyInstance is ReloadableResilienceStrategy)); + isReloadable: innerStrategies.Exists(s => s.StrategyInstance is ReloadableResiliencePipeline)); } - private static object GetStrategyInstance(ResilienceStrategy strategy) + private static object GetStrategyInstance(ResiliencePipeline strategy) { - if (strategy is ReactiveResilienceStrategyBridge reactiveBridge) + if (strategy is ResiliencePipelineBridge reactiveBridge) { return reactiveBridge.Strategy; } - if (strategy is NonReactiveResilienceStrategyBridge nonReactiveBridge) + if (strategy is ResiliencePipelineBridge nonReactiveBridge) { return nonReactiveBridge.Strategy; } @@ -61,21 +61,21 @@ private static object GetStrategyInstance(ResilienceStrategy strategy) return strategy; } - private static bool ShouldSkip(object instance) => instance is ReloadableResilienceStrategy; + private static bool ShouldSkip(object instance) => instance is ReloadableResiliencePipeline; - private static void ExpandStrategies(this ResilienceStrategy strategy, List strategies) + private static void ExpandStrategies(this ResiliencePipeline strategy, List strategies) { - if (strategy is CompositeResilienceStrategy pipeline) + if (strategy is CompositeResiliencePipeline pipeline) { foreach (var inner in pipeline.Strategies) { inner.ExpandStrategies(strategies); } } - else if (strategy is ReloadableResilienceStrategy reloadable) + else if (strategy is ReloadableResiliencePipeline reloadable) { strategies.Add(reloadable); - ExpandStrategies(reloadable.Strategy, strategies); + ExpandStrategies(reloadable.Pipeline, strategies); } else { diff --git a/src/Polly.Testing/ResilienceStrategyDescriptor.cs b/src/Polly.Testing/ResilienceStrategyDescriptor.cs index 129c6f9af27..259beb89777 100644 --- a/src/Polly.Testing/ResilienceStrategyDescriptor.cs +++ b/src/Polly.Testing/ResilienceStrategyDescriptor.cs @@ -1,7 +1,7 @@ namespace Polly.Testing; /// -/// This class provides additional information about a . +/// This class provides additional information about a . /// public sealed class ResilienceStrategyDescriptor { diff --git a/src/Polly/PublicAPI.Unshipped.txt b/src/Polly/PublicAPI.Unshipped.txt index 720e3ce75e9..b7e5655685e 100644 --- a/src/Polly/PublicAPI.Unshipped.txt +++ b/src/Polly/PublicAPI.Unshipped.txt @@ -1,5 +1,5 @@ -Polly.ResilienceStrategyConversionExtensions -static Polly.ResilienceStrategyConversionExtensions.AsAsyncPolicy(this Polly.ResilienceStrategy strategy) -> Polly.IAsyncPolicy -static Polly.ResilienceStrategyConversionExtensions.AsAsyncPolicy(this Polly.ResilienceStrategy strategy) -> Polly.IAsyncPolicy -static Polly.ResilienceStrategyConversionExtensions.AsSyncPolicy(this Polly.ResilienceStrategy strategy) -> Polly.ISyncPolicy -static Polly.ResilienceStrategyConversionExtensions.AsSyncPolicy(this Polly.ResilienceStrategy strategy) -> Polly.ISyncPolicy +Polly.ResiliencePipelineConversionExtensions +static Polly.ResiliencePipelineConversionExtensions.AsAsyncPolicy(this Polly.ResiliencePipeline strategy) -> Polly.IAsyncPolicy +static Polly.ResiliencePipelineConversionExtensions.AsAsyncPolicy(this Polly.ResiliencePipeline strategy) -> Polly.IAsyncPolicy +static Polly.ResiliencePipelineConversionExtensions.AsSyncPolicy(this Polly.ResiliencePipeline strategy) -> Polly.ISyncPolicy +static Polly.ResiliencePipelineConversionExtensions.AsSyncPolicy(this Polly.ResiliencePipeline strategy) -> Polly.ISyncPolicy diff --git a/src/Polly/ResilienceStrategyConversionExtensions.cs b/src/Polly/ResiliencePipelineConversionExtensions.cs similarity index 69% rename from src/Polly/ResilienceStrategyConversionExtensions.cs rename to src/Polly/ResiliencePipelineConversionExtensions.cs index 7c71fa7909a..b943c65805c 100644 --- a/src/Polly/ResilienceStrategyConversionExtensions.cs +++ b/src/Polly/ResiliencePipelineConversionExtensions.cs @@ -5,41 +5,41 @@ namespace Polly; /// /// Extensions for conversion of resilience strategies to policies. /// -public static class ResilienceStrategyConversionExtensions +public static class ResiliencePipelineConversionExtensions { /// - /// Converts a to an . + /// Converts a to an . /// /// The strategy instance. /// An instance of . /// Thrown when is . - public static IAsyncPolicy AsAsyncPolicy(this ResilienceStrategy strategy) - => new ResilienceStrategyAsyncPolicy(strategy ?? throw new ArgumentNullException(nameof(strategy))); + public static IAsyncPolicy AsAsyncPolicy(this ResiliencePipeline strategy) + => new ResiliencePipelineAsyncPolicy(strategy ?? throw new ArgumentNullException(nameof(strategy))); /// - /// Converts a to an . + /// Converts a to an . /// /// The strategy instance. /// An instance of . /// Thrown when is . - public static IAsyncPolicy AsAsyncPolicy(this ResilienceStrategy strategy) - => new ResilienceStrategyAsyncPolicy(strategy ?? throw new ArgumentNullException(nameof(strategy))); + public static IAsyncPolicy AsAsyncPolicy(this ResiliencePipeline strategy) + => new ResiliencePipelineAsyncPolicy(strategy ?? throw new ArgumentNullException(nameof(strategy))); /// - /// Converts a to an . + /// Converts a to an . /// /// The strategy instance. /// An instance of . /// Thrown when is . - public static ISyncPolicy AsSyncPolicy(this ResilienceStrategy strategy) - => new ResilienceStrategySyncPolicy(strategy ?? throw new ArgumentNullException(nameof(strategy))); + public static ISyncPolicy AsSyncPolicy(this ResiliencePipeline strategy) + => new ResiliencePipelineSyncPolicy(strategy ?? throw new ArgumentNullException(nameof(strategy))); /// - /// Converts a to an . + /// Converts a to an . /// /// The strategy instance. /// An instance of . /// Thrown when is . - public static ISyncPolicy AsSyncPolicy(this ResilienceStrategy strategy) - => new ResilienceStrategySyncPolicy(strategy ?? throw new ArgumentNullException(nameof(strategy))); + public static ISyncPolicy AsSyncPolicy(this ResiliencePipeline strategy) + => new ResiliencePipelineSyncPolicy(strategy ?? throw new ArgumentNullException(nameof(strategy))); } diff --git a/src/Polly/Utilities/Wrappers/ResilienceStrategyAsyncPolicy.TResult.cs b/src/Polly/Utilities/Wrappers/ResiliencePipelineAsyncPolicy.TResult.cs similarity index 78% rename from src/Polly/Utilities/Wrappers/ResilienceStrategyAsyncPolicy.TResult.cs rename to src/Polly/Utilities/Wrappers/ResiliencePipelineAsyncPolicy.TResult.cs index 034f13514a2..cec45a858a2 100644 --- a/src/Polly/Utilities/Wrappers/ResilienceStrategyAsyncPolicy.TResult.cs +++ b/src/Polly/Utilities/Wrappers/ResiliencePipelineAsyncPolicy.TResult.cs @@ -1,10 +1,10 @@ namespace Polly.Utilities.Wrappers; -internal sealed class ResilienceStrategyAsyncPolicy : AsyncPolicy +internal sealed class ResiliencePipelineAsyncPolicy : AsyncPolicy { - private readonly ResilienceStrategy _strategy; + private readonly ResiliencePipeline _pipeline; - public ResilienceStrategyAsyncPolicy(ResilienceStrategy strategy) => _strategy = strategy; + public ResiliencePipelineAsyncPolicy(ResiliencePipeline strategy) => _pipeline = strategy; protected override async Task ImplementationAsync(Func> action, Context context, CancellationToken cancellationToken, bool continueOnCapturedContext) { @@ -16,7 +16,7 @@ protected override async Task ImplementationAsync(Func { return await state.action(state.context, resilienceContext.CancellationToken).ConfigureAwait(resilienceContext.ContinueOnCapturedContext); diff --git a/src/Polly/Utilities/Wrappers/ResilienceStrategyAsyncPolicy.cs b/src/Polly/Utilities/Wrappers/ResiliencePipelineAsyncPolicy.cs similarity index 86% rename from src/Polly/Utilities/Wrappers/ResilienceStrategyAsyncPolicy.cs rename to src/Polly/Utilities/Wrappers/ResiliencePipelineAsyncPolicy.cs index bc5c6008c63..4548f4aa71f 100644 --- a/src/Polly/Utilities/Wrappers/ResilienceStrategyAsyncPolicy.cs +++ b/src/Polly/Utilities/Wrappers/ResiliencePipelineAsyncPolicy.cs @@ -1,10 +1,10 @@ namespace Polly.Utilities.Wrappers; -internal sealed class ResilienceStrategyAsyncPolicy : AsyncPolicy +internal sealed class ResiliencePipelineAsyncPolicy : AsyncPolicy { - private readonly ResilienceStrategy _strategy; + private readonly ResiliencePipeline _pipeline; - public ResilienceStrategyAsyncPolicy(ResilienceStrategy strategy) => _strategy = strategy; + public ResiliencePipelineAsyncPolicy(ResiliencePipeline strategy) => _pipeline = strategy; protected override async Task ImplementationAsync( Func action, @@ -20,7 +20,7 @@ protected override async Task ImplementationAsync( try { - await _strategy.ExecuteAsync( + await _pipeline.ExecuteAsync( static async (resilienceContext, state) => { await state.action(state.context, resilienceContext.CancellationToken).ConfigureAwait(resilienceContext.ContinueOnCapturedContext); @@ -48,7 +48,7 @@ protected override async Task ImplementationAsync( try { - return await _strategy.ExecuteAsync( + return await _pipeline.ExecuteAsync( static async (resilienceContext, state) => { return await state.action(state.context, resilienceContext.CancellationToken).ConfigureAwait(resilienceContext.ContinueOnCapturedContext); diff --git a/src/Polly/Utilities/Wrappers/ResilienceStrategySyncPolicy.TResult.cs b/src/Polly/Utilities/Wrappers/ResiliencePipelineSyncPolicy.TResult.cs similarity index 74% rename from src/Polly/Utilities/Wrappers/ResilienceStrategySyncPolicy.TResult.cs rename to src/Polly/Utilities/Wrappers/ResiliencePipelineSyncPolicy.TResult.cs index 48f321f7435..d4fca1c3e37 100644 --- a/src/Polly/Utilities/Wrappers/ResilienceStrategySyncPolicy.TResult.cs +++ b/src/Polly/Utilities/Wrappers/ResiliencePipelineSyncPolicy.TResult.cs @@ -1,10 +1,10 @@ namespace Polly.Utilities.Wrappers; -internal sealed class ResilienceStrategySyncPolicy : Policy +internal sealed class ResiliencePipelineSyncPolicy : Policy { - private readonly ResilienceStrategy _strategy; + private readonly ResiliencePipeline _pipeline; - public ResilienceStrategySyncPolicy(ResilienceStrategy strategy) => _strategy = strategy; + public ResiliencePipelineSyncPolicy(ResiliencePipeline strategy) => _pipeline = strategy; protected override TResult Implementation(Func action, Context context, CancellationToken cancellationToken) { @@ -16,7 +16,7 @@ protected override TResult Implementation(Func { return state.action(state.context, context.CancellationToken); diff --git a/src/Polly/Utilities/Wrappers/ResilienceStrategySyncPolicy.cs b/src/Polly/Utilities/Wrappers/ResiliencePipelineSyncPolicy.cs similarity index 84% rename from src/Polly/Utilities/Wrappers/ResilienceStrategySyncPolicy.cs rename to src/Polly/Utilities/Wrappers/ResiliencePipelineSyncPolicy.cs index 0de0f613032..f63eda601ce 100644 --- a/src/Polly/Utilities/Wrappers/ResilienceStrategySyncPolicy.cs +++ b/src/Polly/Utilities/Wrappers/ResiliencePipelineSyncPolicy.cs @@ -1,10 +1,10 @@ namespace Polly.Utilities.Wrappers; -internal sealed class ResilienceStrategySyncPolicy : Policy +internal sealed class ResiliencePipelineSyncPolicy : Policy { - private readonly ResilienceStrategy _strategy; + private readonly ResiliencePipeline _pipeline; - public ResilienceStrategySyncPolicy(ResilienceStrategy strategy) => _strategy = strategy; + public ResiliencePipelineSyncPolicy(ResiliencePipeline strategy) => _pipeline = strategy; protected override void Implementation(Action action, Context context, CancellationToken cancellationToken) { @@ -16,7 +16,7 @@ protected override void Implementation(Action action try { - _strategy.Execute( + _pipeline.Execute( static (context, state) => { state.action(state.context, context.CancellationToken); @@ -40,7 +40,7 @@ protected override TResult Implementation(Func { return state.action(state.context, context.CancellationToken); diff --git a/test/Polly.Core.Tests/CircuitBreaker/CircuitBreakerCompositeStrategyBuilderTests.cs b/test/Polly.Core.Tests/CircuitBreaker/CircuitBreakerResiliencePipelineBuilderTests.cs similarity index 74% rename from test/Polly.Core.Tests/CircuitBreaker/CircuitBreakerCompositeStrategyBuilderTests.cs rename to test/Polly.Core.Tests/CircuitBreaker/CircuitBreakerResiliencePipelineBuilderTests.cs index 575febe550d..94122e3162a 100644 --- a/test/Polly.Core.Tests/CircuitBreaker/CircuitBreakerCompositeStrategyBuilderTests.cs +++ b/test/Polly.Core.Tests/CircuitBreaker/CircuitBreakerResiliencePipelineBuilderTests.cs @@ -5,9 +5,9 @@ namespace Polly.Core.Tests.CircuitBreaker; -public class CircuitBreakerCompositeStrategyBuilderTests +public class CircuitBreakerResiliencePipelineBuilderTests { - public static TheoryData> ConfigureData = new() + public static TheoryData> ConfigureData = new() { builder => builder.AddCircuitBreaker(new CircuitBreakerStrategyOptions { @@ -15,7 +15,7 @@ public class CircuitBreakerCompositeStrategyBuilderTests }), }; - public static TheoryData>> ConfigureDataGeneric = new() + public static TheoryData>> ConfigureDataGeneric = new() { builder => builder.AddCircuitBreaker(new CircuitBreakerStrategyOptions { @@ -25,35 +25,35 @@ public class CircuitBreakerCompositeStrategyBuilderTests [MemberData(nameof(ConfigureData))] [Theory] - public void AddCircuitBreaker_Configure(Action builderAction) + public void AddCircuitBreaker_Configure(Action builderAction) { - var builder = new CompositeStrategyBuilder(); + var builder = new ResiliencePipelineBuilder(); builderAction(builder); - builder.Build().GetInnerStrategies().FirstStrategy.StrategyInstance.Should().BeOfType>(); + builder.Build().GetPipelineDescriptor().FirstStrategy.StrategyInstance.Should().BeOfType>(); } [MemberData(nameof(ConfigureDataGeneric))] [Theory] - public void AddCircuitBreaker_Generic_Configure(Action> builderAction) + public void AddCircuitBreaker_Generic_Configure(Action> builderAction) { - var builder = new CompositeStrategyBuilder(); + var builder = new ResiliencePipelineBuilder(); builderAction(builder); - builder.Build().GetInnerStrategies().FirstStrategy.StrategyInstance.Should().BeOfType>(); + builder.Build().GetPipelineDescriptor().FirstStrategy.StrategyInstance.Should().BeOfType>(); } [Fact] public void AddCircuitBreaker_Validation() { - new CompositeStrategyBuilder() + new ResiliencePipelineBuilder() .Invoking(b => b.AddCircuitBreaker(new CircuitBreakerStrategyOptions { BreakDuration = TimeSpan.MinValue })) .Should() .Throw(); - new CompositeStrategyBuilder() + new ResiliencePipelineBuilder() .Invoking(b => b.AddCircuitBreaker(new CircuitBreakerStrategyOptions { BreakDuration = TimeSpan.MinValue })) .Should() .Throw(); @@ -79,7 +79,7 @@ public void AddCircuitBreaker_IntegrationTest() }; var timeProvider = new FakeTimeProvider(); - var strategy = new CompositeStrategyBuilder { TimeProvider = timeProvider }.AddCircuitBreaker(options).Build(); + var strategy = new ResiliencePipelineBuilder { TimeProvider = timeProvider }.AddCircuitBreaker(options).Build(); for (int i = 0; i < 10; i++) { @@ -114,11 +114,11 @@ public async Task AddCircuitBreakers_WithIsolatedManualControl_ShouldBeIsolated( var manualControl = new CircuitBreakerManualControl(); await manualControl.IsolateAsync(); - var strategy1 = new CompositeStrategyBuilder() + var strategy1 = new ResiliencePipelineBuilder() .AddCircuitBreaker(new() { ManualControl = manualControl }) .Build(); - var strategy2 = new CompositeStrategyBuilder() + var strategy2 = new ResiliencePipelineBuilder() .AddCircuitBreaker(new() { ManualControl = manualControl }) .Build(); diff --git a/test/Polly.Core.Tests/CircuitBreaker/CircuitBreakerResilienceStrategyTests.cs b/test/Polly.Core.Tests/CircuitBreaker/CircuitBreakerResilienceStrategyTests.cs index 1ccf2703c99..fb17d6045e6 100644 --- a/test/Polly.Core.Tests/CircuitBreaker/CircuitBreakerResilienceStrategyTests.cs +++ b/test/Polly.Core.Tests/CircuitBreaker/CircuitBreakerResilienceStrategyTests.cs @@ -135,6 +135,6 @@ public void Execute_Ok() _behavior.Received(1).OnActionSuccess(CircuitState.Closed); } - private ReactiveResilienceStrategyBridge Create() + private ResiliencePipelineBridge Create() => new(new CircuitBreakerResilienceStrategy(_options.ShouldHandle!, _controller, _options.StateProvider, _options.ManualControl)); } diff --git a/test/Polly.Core.Tests/Fallback/FallbackCompositeStrategyBuilderExtensionsTests.cs b/test/Polly.Core.Tests/Fallback/FallbackResiliencePipelineBuilderExtensionsTests.cs similarity index 70% rename from test/Polly.Core.Tests/Fallback/FallbackCompositeStrategyBuilderExtensionsTests.cs rename to test/Polly.Core.Tests/Fallback/FallbackResiliencePipelineBuilderExtensionsTests.cs index d428655818c..6fa7dad6fe7 100644 --- a/test/Polly.Core.Tests/Fallback/FallbackCompositeStrategyBuilderExtensionsTests.cs +++ b/test/Polly.Core.Tests/Fallback/FallbackResiliencePipelineBuilderExtensionsTests.cs @@ -4,9 +4,9 @@ namespace Polly.Core.Tests.Fallback; -public class FallbackCompositeStrategyBuilderExtensionsTests +public class FallbackResiliencePipelineBuilderExtensionsTests { - public static readonly TheoryData>> FallbackOverloadsGeneric = new() + public static readonly TheoryData>> FallbackOverloadsGeneric = new() { builder => { @@ -20,12 +20,12 @@ public class FallbackCompositeStrategyBuilderExtensionsTests [MemberData(nameof(FallbackOverloadsGeneric))] [Theory] - public void AddFallback_Generic_Ok(Action> configure) + public void AddFallback_Generic_Ok(Action> configure) { - var builder = new CompositeStrategyBuilder(); + var builder = new ResiliencePipelineBuilder(); configure(builder); - builder.Build().GetInnerStrategies().FirstStrategy.StrategyInstance.Should().BeOfType(typeof(FallbackResilienceStrategy)); + builder.Build().GetPipelineDescriptor().FirstStrategy.StrategyInstance.Should().BeOfType(typeof(FallbackResilienceStrategy)); } [Fact] @@ -42,7 +42,7 @@ public void AddFallback_Ok() FallbackAction = _ => Outcome.FromResultAsTask((object)1) }; - var strategy = new CompositeStrategyBuilder().AddFallback(options).Build(); + var strategy = new ResiliencePipelineBuilder().AddFallback(options).Build(); strategy.Execute(_ => -1).Should().Be(1); strategy.Execute(_ => throw new InvalidOperationException()).Should().Be(1); @@ -51,7 +51,7 @@ public void AddFallback_Ok() [Fact] public void AddFallback_InvalidOptions_Throws() { - new CompositeStrategyBuilder() + new ResiliencePipelineBuilder() .Invoking(b => b.AddFallback(new FallbackStrategyOptions())) .Should() .Throw(); @@ -60,7 +60,7 @@ public void AddFallback_InvalidOptions_Throws() [Fact] public void AddFallbackT_InvalidOptions_Throws() { - new CompositeStrategyBuilder() + new ResiliencePipelineBuilder() .Invoking(b => b.AddFallback(new FallbackStrategyOptions())) .Should() .Throw(); diff --git a/test/Polly.Core.Tests/Fallback/FallbackResilienceStrategyTests.cs b/test/Polly.Core.Tests/Fallback/FallbackResilienceStrategyTests.cs index 9a5091fc030..ecde38004c8 100644 --- a/test/Polly.Core.Tests/Fallback/FallbackResilienceStrategyTests.cs +++ b/test/Polly.Core.Tests/Fallback/FallbackResilienceStrategyTests.cs @@ -90,7 +90,7 @@ private void SetHandler( _handler = FallbackHelper.CreateHandler(shouldHandle, fallback); } - private ReactiveResilienceStrategyBridge Create() => new(new FallbackResilienceStrategy( + private ResiliencePipelineBridge Create() => new(new FallbackResilienceStrategy( _handler!, _options.OnFallback, _telemetry)); diff --git a/test/Polly.Core.Tests/GenericCompositeStrategyBuilderTests.cs b/test/Polly.Core.Tests/GenericResiliencePipelineBuilderTests.cs similarity index 69% rename from test/Polly.Core.Tests/GenericCompositeStrategyBuilderTests.cs rename to test/Polly.Core.Tests/GenericResiliencePipelineBuilderTests.cs index 6cc3b69bcac..f8eb355b143 100644 --- a/test/Polly.Core.Tests/GenericCompositeStrategyBuilderTests.cs +++ b/test/Polly.Core.Tests/GenericResiliencePipelineBuilderTests.cs @@ -3,9 +3,9 @@ namespace Polly.Core.Tests; -public class GenericCompositeStrategyBuilderTests +public class GenericResiliencePipelineBuilderTests { - private readonly CompositeStrategyBuilder _builder = new(); + private readonly ResiliencePipelineBuilder _builder = new(); [Fact] public void Ctor_EnsureDefaults() @@ -18,7 +18,7 @@ public void Ctor_EnsureDefaults() [Fact] public void CopyCtor_Ok() { - new CompositeStrategyBuilder(new CompositeStrategyBuilder()).Should().NotBeNull(); + new ResiliencePipelineBuilder(new ResiliencePipelineBuilder()).Should().NotBeNull(); } [Fact] @@ -44,21 +44,21 @@ public void Build_Ok() // assert strategy.Should().NotBeNull(); - strategy.Strategy.Should().BeOfType().Subject.Strategies.Should().HaveCount(2); + strategy.Strategy.Should().BeOfType().Subject.Strategies.Should().HaveCount(2); } [Fact] public void AddGenericStrategy_Ok() { // arrange - var testStrategy = new ResilienceStrategy(new TestResilienceStrategy().AsStrategy()); - _builder.AddStrategy(testStrategy); + var testStrategy = new ResiliencePipeline(new TestResilienceStrategy().AsPipeline()); + _builder.AddPipeline(testStrategy); // act var strategy = _builder.Build(); // assert strategy.Should().NotBeNull(); - ((CompositeResilienceStrategy)strategy.Strategy).Strategies[0].Should().Be(testStrategy.Strategy); + ((CompositeResiliencePipeline)strategy.Strategy).Strategies[0].Should().Be(testStrategy.Strategy); } } diff --git a/test/Polly.Core.Tests/Hedging/HedgingCompositeStrategyBuilderExtensionsTests.cs b/test/Polly.Core.Tests/Hedging/HedgingResiliencePipelineBuilderExtensionsTests.cs similarity index 90% rename from test/Polly.Core.Tests/Hedging/HedgingCompositeStrategyBuilderExtensionsTests.cs rename to test/Polly.Core.Tests/Hedging/HedgingResiliencePipelineBuilderExtensionsTests.cs index 3afda1956bc..106e23a86cb 100644 --- a/test/Polly.Core.Tests/Hedging/HedgingCompositeStrategyBuilderExtensionsTests.cs +++ b/test/Polly.Core.Tests/Hedging/HedgingResiliencePipelineBuilderExtensionsTests.cs @@ -4,17 +4,17 @@ namespace Polly.Core.Tests.Hedging; -public class HedgingCompositeStrategyBuilderExtensionsTests +public class HedgingResiliencePipelineBuilderExtensionsTests { - private readonly CompositeStrategyBuilder _builder = new(); - private readonly CompositeStrategyBuilder _genericBuilder = new(); + private readonly ResiliencePipelineBuilder _builder = new(); + private readonly ResiliencePipelineBuilder _genericBuilder = new(); [Fact] public void AddHedging_Ok() { _builder.AddHedging(new HedgingStrategyOptions { ShouldHandle = _ => PredicateResult.True }); - _builder.Build().GetInnerStrategies().FirstStrategy.StrategyInstance + _builder.Build().GetPipelineDescriptor().FirstStrategy.StrategyInstance .Should().BeOfType>().Subject .HedgingHandler.IsGeneric.Should().BeFalse(); } @@ -28,7 +28,7 @@ public void AddHedging_Generic_Ok() ShouldHandle = _ => PredicateResult.True }); - _genericBuilder.Build().GetInnerStrategies().FirstStrategy.StrategyInstance + _genericBuilder.Build().GetPipelineDescriptor().FirstStrategy.StrategyInstance .Should().BeOfType>().Subject .HedgingHandler.IsGeneric.Should().BeTrue(); } diff --git a/test/Polly.Core.Tests/Hedging/HedgingResilienceStrategyTests.cs b/test/Polly.Core.Tests/Hedging/HedgingResilienceStrategyTests.cs index a6aabcccfb5..f6e77b38a63 100644 --- a/test/Polly.Core.Tests/Hedging/HedgingResilienceStrategyTests.cs +++ b/test/Polly.Core.Tests/Hedging/HedgingResilienceStrategyTests.cs @@ -330,7 +330,7 @@ public async Task ExecuteAsync_EnsureDiscardedResultDisposed() }; }); - var strategy = new ReactiveResilienceStrategyBridge(Create(handler, null)); + var strategy = new ResiliencePipelineBridge(Create(handler, null)); // act var resultTask = strategy.ExecuteAsync(async token => @@ -954,7 +954,7 @@ private void ConfigureHedging(TimeSpan delay) => ConfigureHedging(args => async return Outcome.FromResult("secondary"); }); - private ReactiveResilienceStrategyBridge Create() => new(Create(_handler!, _options.OnHedging)); + private ResiliencePipelineBridge Create() => new(Create(_handler!, _options.OnHedging)); private HedgingResilienceStrategy Create( HedgingHandler handler, diff --git a/test/Polly.Core.Tests/Issues/IssuesTests.CircuitBreakerStateSharing_959.cs b/test/Polly.Core.Tests/Issues/IssuesTests.CircuitBreakerStateSharing_959.cs index 6826a9092e6..2d2a1ba769f 100644 --- a/test/Polly.Core.Tests/Issues/IssuesTests.CircuitBreakerStateSharing_959.cs +++ b/test/Polly.Core.Tests/Issues/IssuesTests.CircuitBreakerStateSharing_959.cs @@ -23,7 +23,7 @@ public void CircuitBreakerStateSharing_959() }; // create the strategy - var strategy = new CompositeStrategyBuilder { TimeProvider = TimeProvider }.AddCircuitBreaker(options).Build(); + var strategy = new ResiliencePipelineBuilder { TimeProvider = TimeProvider }.AddCircuitBreaker(options).Build(); // now trigger the circuit breaker by evaluating multiple result types for (int i = 0; i < 5; i++) diff --git a/test/Polly.Core.Tests/Issues/IssuesTests.FlowingContext_849.cs b/test/Polly.Core.Tests/Issues/IssuesTests.FlowingContext_849.cs index 2b0d9d854b2..7b1a829e4db 100644 --- a/test/Polly.Core.Tests/Issues/IssuesTests.FlowingContext_849.cs +++ b/test/Polly.Core.Tests/Issues/IssuesTests.FlowingContext_849.cs @@ -8,7 +8,7 @@ public partial class IssuesTests public void FlowingContext_849() { var contextChecked = false; - var strategy = new CompositeStrategyBuilder() + var strategy = new ResiliencePipelineBuilder() .AddRetry(new RetryStrategyOptions { // configure the predicate and use the context diff --git a/test/Polly.Core.Tests/Issues/IssuesTests.HandleMultipleResults_898.cs b/test/Polly.Core.Tests/Issues/IssuesTests.HandleMultipleResults_898.cs index fbef041d037..c6f3bb2dab2 100644 --- a/test/Polly.Core.Tests/Issues/IssuesTests.HandleMultipleResults_898.cs +++ b/test/Polly.Core.Tests/Issues/IssuesTests.HandleMultipleResults_898.cs @@ -31,7 +31,7 @@ public void HandleMultipleResults_898() }; // create the strategy - var strategy = new CompositeStrategyBuilder().AddRetry(options).Build(); + var strategy = new ResiliencePipelineBuilder().AddRetry(options).Build(); // check that int-based results is retried bool isRetry = false; diff --git a/test/Polly.Core.Tests/NullResiliencePipelineTests.cs b/test/Polly.Core.Tests/NullResiliencePipelineTests.cs new file mode 100644 index 00000000000..874b9eb6d47 --- /dev/null +++ b/test/Polly.Core.Tests/NullResiliencePipelineTests.cs @@ -0,0 +1,22 @@ +namespace Polly.Core.Tests; + +public class NullResiliencePipelineTests +{ + [Fact] + public void Instance_ShouldNotBeNull() + { + NullResiliencePipeline.Instance.Should().NotBeNull(); + NullResiliencePipeline.Instance.Should().NotBeNull(); + + } + + [Fact] + public void Execute_Ok() + { + bool executed = false; + NullResiliencePipeline.Instance.Execute(_ => executed = true); + executed.Should().BeTrue(); + + NullResiliencePipeline.Instance.Execute(_ => "res").Should().Be("res"); + } +} diff --git a/test/Polly.Core.Tests/NullResilienceStrategyTests.cs b/test/Polly.Core.Tests/NullResilienceStrategyTests.cs deleted file mode 100644 index 343106cec24..00000000000 --- a/test/Polly.Core.Tests/NullResilienceStrategyTests.cs +++ /dev/null @@ -1,22 +0,0 @@ -namespace Polly.Core.Tests; - -public class NullResilienceStrategyTests -{ - [Fact] - public void Instance_ShouldNotBeNull() - { - NullResilienceStrategy.Instance.Should().NotBeNull(); - NullResilienceStrategy.Instance.Should().NotBeNull(); - - } - - [Fact] - public void Execute_Ok() - { - bool executed = false; - NullResilienceStrategy.Instance.Execute(_ => executed = true); - executed.Should().BeTrue(); - - NullResilienceStrategy.Instance.Execute(_ => "res").Should().Be("res"); - } -} diff --git a/test/Polly.Core.Tests/Registry/ResiliencePipelineProviderTests.cs b/test/Polly.Core.Tests/Registry/ResiliencePipelineProviderTests.cs new file mode 100644 index 00000000000..d33c27bdfbd --- /dev/null +++ b/test/Polly.Core.Tests/Registry/ResiliencePipelineProviderTests.cs @@ -0,0 +1,63 @@ +using System.Diagnostics.CodeAnalysis; +using Polly.Registry; + +namespace Polly.Core.Tests.Registry; + +public class ResiliencePipelineProviderTests +{ + [Fact] + public void Get_DoesNotExist_Throws() + { + new Provider() + .Invoking(o => o.GetPipeline("not-exists")) + .Should() + .Throw() + .WithMessage("Unable to find a resilience pipeline associated with the key 'not-exists'. Please ensure that either the resilience pipeline or the builder is registered."); + } + + [Fact] + public void Get_GenericDoesNotExist_Throws() + { + new Provider() + .Invoking(o => o.GetPipeline("not-exists")) + .Should() + .Throw() + .WithMessage("Unable to find a generic resilience pipeline of 'String' associated with the key 'not-exists'. " + + "Please ensure that either the generic resilience pipeline or the generic builder is registered."); + } + + [Fact] + public void Get_Exist_Ok() + { + var provider = new Provider { Strategy = new TestResilienceStrategy().AsPipeline() }; + + provider.GetPipeline("exists").Should().Be(provider.Strategy); + } + + [Fact] + public void Get_GenericExist_Ok() + { + var provider = new Provider { GenericStrategy = new TestResiliencePipeline() }; + + provider.GetPipeline("exists").Should().Be(provider.GenericStrategy); + } + + private class Provider : ResiliencePipelineProvider + { + public ResiliencePipeline? Strategy { get; set; } + + public object? GenericStrategy { get; set; } + + public override bool TryGetPipeline(string key, [NotNullWhen(true)] out ResiliencePipeline? strategy) + { + strategy = Strategy; + return Strategy != null; + } + + public override bool TryGetPipeline(string key, [NotNullWhen(true)] out ResiliencePipeline? strategy) + { + strategy = (ResiliencePipeline?)GenericStrategy; + return GenericStrategy != null; + } + } +} diff --git a/test/Polly.Core.Tests/Registry/ResilienceStrategyRegistryOptionsTests.cs b/test/Polly.Core.Tests/Registry/ResiliencePipelineRegistryOptionsTests.cs similarity index 76% rename from test/Polly.Core.Tests/Registry/ResilienceStrategyRegistryOptionsTests.cs rename to test/Polly.Core.Tests/Registry/ResiliencePipelineRegistryOptionsTests.cs index 4315fe10498..0565f3fc68e 100644 --- a/test/Polly.Core.Tests/Registry/ResilienceStrategyRegistryOptionsTests.cs +++ b/test/Polly.Core.Tests/Registry/ResiliencePipelineRegistryOptionsTests.cs @@ -1,12 +1,12 @@ using Polly.Registry; namespace Polly.Core.Tests.Registry; -public class ResilienceStrategyRegistryOptionsTests +public class ResiliencePipelineRegistryOptionsTests { [Fact] public void Ctor_EnsureDefaults() { - ResilienceStrategyRegistryOptions options = new(); + ResiliencePipelineRegistryOptions options = new(); options.InstanceNameFormatter.Should().BeNull(); diff --git a/test/Polly.Core.Tests/Registry/ResilienceStrategyRegistryTests.cs b/test/Polly.Core.Tests/Registry/ResiliencePipelineRegistryTests.cs similarity index 59% rename from test/Polly.Core.Tests/Registry/ResilienceStrategyRegistryTests.cs rename to test/Polly.Core.Tests/Registry/ResiliencePipelineRegistryTests.cs index da6b19f8dae..97b22265634 100644 --- a/test/Polly.Core.Tests/Registry/ResilienceStrategyRegistryTests.cs +++ b/test/Polly.Core.Tests/Registry/ResiliencePipelineRegistryTests.cs @@ -6,172 +6,172 @@ namespace Polly.Core.Tests.Registry; -public class ResilienceStrategyRegistryTests +public class ResiliencePipelineRegistryTests { - private readonly ResilienceStrategyRegistryOptions _options; + private readonly ResiliencePipelineRegistryOptions _options; - private Action _callback = _ => { }; + private Action _callback = _ => { }; - public ResilienceStrategyRegistryTests() => _options = new() + public ResiliencePipelineRegistryTests() => _options = new() { BuilderFactory = () => { - var builder = new CompositeStrategyBuilder(); + var builder = new ResiliencePipelineBuilder(); _callback(builder); return builder; }, - StrategyComparer = StrategyId.Comparer, + PipelineComparer = StrategyId.Comparer, BuilderComparer = StrategyId.BuilderComparer }; [Fact] public void Ctor_Default_Ok() { - this.Invoking(_ => new ResilienceStrategyRegistry()).Should().NotThrow(); + this.Invoking(_ => new ResiliencePipelineRegistry()).Should().NotThrow(); } [Fact] public void Ctor_InvalidOptions_Throws() { - this.Invoking(_ => new ResilienceStrategyRegistry(new ResilienceStrategyRegistryOptions { BuilderFactory = null! })) + this.Invoking(_ => new ResiliencePipelineRegistry(new ResiliencePipelineRegistryOptions { BuilderFactory = null! })) .Should() .Throw(); } [Fact] - public void Clear_Ok() + public void ClearPipelines_Ok() { - var registry = new ResilienceStrategyRegistry(); + var registry = new ResiliencePipelineRegistry(); registry.TryAddBuilder("C", (b, _) => b.AddStrategy(new TestResilienceStrategy())); - registry.TryAddStrategy("A", new TestResilienceStrategy().AsStrategy()); - registry.TryAddStrategy("B", new TestResilienceStrategy().AsStrategy()); - registry.TryAddStrategy("C", new TestResilienceStrategy().AsStrategy()); + registry.TryAddPipeline("A", new TestResilienceStrategy().AsPipeline()); + registry.TryAddPipeline("B", new TestResilienceStrategy().AsPipeline()); + registry.TryAddPipeline("C", new TestResilienceStrategy().AsPipeline()); - registry.ClearStrategies(); + registry.ClearPipelines(); - registry.TryGetStrategy("A", out _).Should().BeFalse(); - registry.TryGetStrategy("B", out _).Should().BeFalse(); - registry.TryGetStrategy("C", out _).Should().BeTrue(); + registry.TryGetPipeline("A", out _).Should().BeFalse(); + registry.TryGetPipeline("B", out _).Should().BeFalse(); + registry.TryGetPipeline("C", out _).Should().BeTrue(); } [Fact] - public void Clear_Generic_Ok() + public void ClearPipelines_Generic_Ok() { - var registry = new ResilienceStrategyRegistry(); + var registry = new ResiliencePipelineRegistry(); registry.TryAddBuilder("C", (b, _) => b.AddStrategy(new TestResilienceStrategy())); - registry.TryAddStrategy("A", new TestResilienceStrategy()); - registry.TryAddStrategy("B", new TestResilienceStrategy()); - registry.TryAddStrategy("C", new TestResilienceStrategy()); + registry.TryAddPipeline("A", new TestResiliencePipeline()); + registry.TryAddPipeline("B", new TestResiliencePipeline()); + registry.TryAddPipeline("C", new TestResiliencePipeline()); - registry.ClearStrategies(); + registry.ClearPipelines(); - registry.TryGetStrategy("A", out _).Should().BeFalse(); - registry.TryGetStrategy("B", out _).Should().BeFalse(); - registry.TryGetStrategy("C", out _).Should().BeTrue(); + registry.TryGetPipeline("A", out _).Should().BeFalse(); + registry.TryGetPipeline("B", out _).Should().BeFalse(); + registry.TryGetPipeline("C", out _).Should().BeTrue(); } [Fact] public void Remove_Ok() { - var registry = new ResilienceStrategyRegistry(); + var registry = new ResiliencePipelineRegistry(); - registry.TryAddStrategy("A", new TestResilienceStrategy().AsStrategy()); - registry.TryAddStrategy("B", new TestResilienceStrategy().AsStrategy()); + registry.TryAddPipeline("A", new TestResilienceStrategy().AsPipeline()); + registry.TryAddPipeline("B", new TestResilienceStrategy().AsPipeline()); - registry.RemoveStrategy("A").Should().BeTrue(); - registry.RemoveStrategy("A").Should().BeFalse(); + registry.RemovePipeline("A").Should().BeTrue(); + registry.RemovePipeline("A").Should().BeFalse(); - registry.TryGetStrategy("A", out _).Should().BeFalse(); - registry.TryGetStrategy("B", out _).Should().BeTrue(); + registry.TryGetPipeline("A", out _).Should().BeFalse(); + registry.TryGetPipeline("B", out _).Should().BeTrue(); } [Fact] public void Remove_Generic_Ok() { - var registry = new ResilienceStrategyRegistry(); + var registry = new ResiliencePipelineRegistry(); - registry.TryAddStrategy("A", new TestResilienceStrategy()); - registry.TryAddStrategy("B", new TestResilienceStrategy()); + registry.TryAddPipeline("A", new TestResiliencePipeline()); + registry.TryAddPipeline("B", new TestResiliencePipeline()); - registry.RemoveStrategy("A").Should().BeTrue(); - registry.RemoveStrategy("A").Should().BeFalse(); + registry.RemovePipeline("A").Should().BeTrue(); + registry.RemovePipeline("A").Should().BeFalse(); - registry.TryGetStrategy("A", out _).Should().BeFalse(); - registry.TryGetStrategy("B", out _).Should().BeTrue(); + registry.TryGetPipeline("A", out _).Should().BeFalse(); + registry.TryGetPipeline("B", out _).Should().BeTrue(); } [Fact] public void RemoveBuilder_Ok() { - var registry = new ResilienceStrategyRegistry(); + var registry = new ResiliencePipelineRegistry(); registry.TryAddBuilder("A", (b, _) => b.AddStrategy(new TestResilienceStrategy())); registry.RemoveBuilder("A").Should().BeTrue(); registry.RemoveBuilder("A").Should().BeFalse(); - registry.TryGetStrategy("A", out _).Should().BeFalse(); + registry.TryGetPipeline("A", out _).Should().BeFalse(); } [Fact] public void RemoveBuilder_Generic_Ok() { - var registry = new ResilienceStrategyRegistry(); + var registry = new ResiliencePipelineRegistry(); registry.TryAddBuilder("A", (b, _) => b.AddStrategy(new TestResilienceStrategy())); registry.RemoveBuilder("A").Should().BeTrue(); registry.RemoveBuilder("A").Should().BeFalse(); - registry.TryGetStrategy("A", out _).Should().BeFalse(); + registry.TryGetPipeline("A", out _).Should().BeFalse(); } [Fact] - public void GetStrategy_BuilderMultiInstance_EnsureMultipleInstances() + public void GetPipeline_BuilderMultiInstance_EnsureMultipleInstances() { var builderName = "A"; var registry = CreateRegistry(); - var strategies = new HashSet(); + var strategies = new HashSet(); registry.TryAddBuilder(StrategyId.Create(builderName), (builder, _) => builder.AddStrategy(new TestResilienceStrategy())); for (int i = 0; i < 100; i++) { var key = StrategyId.Create(builderName, i.ToString(CultureInfo.InvariantCulture)); - strategies.Add(registry.GetStrategy(key)); + strategies.Add(registry.GetPipeline(key)); // call again, the strategy should be already cached - strategies.Add(registry.GetStrategy(key)); + strategies.Add(registry.GetPipeline(key)); } strategies.Should().HaveCount(100); } [Fact] - public void GetStrategy_GenericBuilderMultiInstance_EnsureMultipleInstances() + public void GetPipeline_GenericBuilderMultiInstance_EnsureMultipleInstances() { var builderName = "A"; var registry = CreateRegistry(); - var strategies = new HashSet>(); + var strategies = new HashSet>(); registry.TryAddBuilder(StrategyId.Create(builderName), (builder, _) => builder.AddStrategy(new TestResilienceStrategy())); for (int i = 0; i < 100; i++) { var key = StrategyId.Create(builderName, i.ToString(CultureInfo.InvariantCulture)); - strategies.Add(registry.GetStrategy(key)); + strategies.Add(registry.GetPipeline(key)); // call again, the strategy should be already cached - strategies.Add(registry.GetStrategy(key)); + strategies.Add(registry.GetPipeline(key)); } strategies.Should().HaveCount(100); } [Fact] - public void AddBuilder_GetStrategy_EnsureCalled() + public void AddBuilder_GetPipeline_EnsureCalled() { var activatorCalls = 0; _callback = _ => activatorCalls++; @@ -180,7 +180,7 @@ public void AddBuilder_GetStrategy_EnsureCalled() registry.TryAddBuilder(StrategyId.Create("A"), (builder, context) => { builder.AddStrategy(new TestResilienceStrategy()); - builder.Properties.Set(StrategyId.ResilienceKey, context.StrategyKey); + builder.Properties.Set(StrategyId.ResilienceKey, context.PipelineKey); called++; }); @@ -188,10 +188,10 @@ public void AddBuilder_GetStrategy_EnsureCalled() var key2 = StrategyId.Create("A", "Instance1"); var key3 = StrategyId.Create("A", "Instance2"); var keys = new[] { key1, key2, key3 }; - var strategies = keys.ToDictionary(k => k, registry.GetStrategy); + var strategies = keys.ToDictionary(k => k, registry.GetPipeline); foreach (var key in keys) { - registry.GetStrategy(key); + registry.GetPipeline(key); } called.Should().Be(3); @@ -200,7 +200,7 @@ public void AddBuilder_GetStrategy_EnsureCalled() } [Fact] - public void AddBuilder_GenericGetStrategy_EnsureCalled() + public void AddBuilder_GenericGetPipeline_EnsureCalled() { var activatorCalls = 0; _callback = _ => activatorCalls++; @@ -209,7 +209,7 @@ public void AddBuilder_GenericGetStrategy_EnsureCalled() registry.TryAddBuilder(StrategyId.Create("A"), (builder, context) => { builder.AddStrategy(new TestResilienceStrategy()); - builder.Properties.Set(StrategyId.ResilienceKey, context.StrategyKey); + builder.Properties.Set(StrategyId.ResilienceKey, context.PipelineKey); called++; }); @@ -217,10 +217,10 @@ public void AddBuilder_GenericGetStrategy_EnsureCalled() var key2 = StrategyId.Create("A", "Instance1"); var key3 = StrategyId.Create("A", "Instance2"); var keys = new[] { key1, key2, key3 }; - var strategies = keys.ToDictionary(k => k, registry.GetStrategy); + var strategies = keys.ToDictionary(k => k, registry.GetPipeline); foreach (var key in keys) { - registry.GetStrategy(key); + registry.GetPipeline(key); } called.Should().Be(3); @@ -229,7 +229,7 @@ public void AddBuilder_GenericGetStrategy_EnsureCalled() } [Fact] - public void AddBuilder_EnsureStrategyKey() + public void AddBuilder_EnsurePipelineKey() { _options.BuilderNameFormatter = k => k.BuilderName; _options.InstanceNameFormatter = k => k.InstanceName; @@ -245,7 +245,7 @@ public void AddBuilder_EnsureStrategyKey() called = true; }); - registry.GetStrategy(StrategyId.Create("A", "Instance1")); + registry.GetPipeline(StrategyId.Create("A", "Instance1")); called.Should().BeTrue(); } @@ -256,12 +256,12 @@ public void AddBuilder_MultipleGeneric_EnsureDistinctInstances() registry.TryAddBuilder(StrategyId.Create("A"), (builder, _) => builder.AddStrategy(new TestResilienceStrategy())); registry.TryAddBuilder(StrategyId.Create("A"), (builder, _) => builder.AddStrategy(new TestResilienceStrategy())); - registry.GetStrategy(StrategyId.Create("A", "Instance1")).Should().BeSameAs(registry.GetStrategy(StrategyId.Create("A", "Instance1"))); - registry.GetStrategy(StrategyId.Create("A", "Instance1")).Should().BeSameAs(registry.GetStrategy(StrategyId.Create("A", "Instance1"))); + registry.GetPipeline(StrategyId.Create("A", "Instance1")).Should().BeSameAs(registry.GetPipeline(StrategyId.Create("A", "Instance1"))); + registry.GetPipeline(StrategyId.Create("A", "Instance1")).Should().BeSameAs(registry.GetPipeline(StrategyId.Create("A", "Instance1"))); } [Fact] - public void AddBuilder_Generic_EnsureStrategyKey() + public void AddBuilder_Generic_EnsurePipelineKey() { _options.BuilderNameFormatter = k => k.BuilderName; _options.InstanceNameFormatter = k => k.InstanceName; @@ -276,7 +276,7 @@ public void AddBuilder_Generic_EnsureStrategyKey() called = true; }); - registry.GetStrategy(StrategyId.Create("A", "Instance1")); + registry.GetPipeline(StrategyId.Create("A", "Instance1")); called.Should().BeTrue(); } @@ -286,7 +286,7 @@ public void TryGet_NoBuilder_Null() var registry = CreateRegistry(); var key = StrategyId.Create("A"); - registry.TryGetStrategy(key, out var strategy).Should().BeFalse(); + registry.TryGetPipeline(key, out var strategy).Should().BeFalse(); strategy.Should().BeNull(); } @@ -296,62 +296,62 @@ public void TryGet_GenericNoBuilder_Null() var registry = CreateRegistry(); var key = StrategyId.Create("A"); - registry.TryGetStrategy(key, out var strategy).Should().BeFalse(); + registry.TryGetPipeline(key, out var strategy).Should().BeFalse(); strategy.Should().BeNull(); } [Fact] - public void TryGet_ExplicitStrategyAdded_Ok() + public void TryGet_ExplicitPipelineAdded_Ok() { - var expectedStrategy = new TestResilienceStrategy().AsStrategy(); + var expectedPipeline = new TestResilienceStrategy().AsPipeline(); var registry = CreateRegistry(); var key = StrategyId.Create("A", "Instance"); - registry.TryAddStrategy(key, expectedStrategy).Should().BeTrue(); + registry.TryAddPipeline(key, expectedPipeline).Should().BeTrue(); - registry.TryGetStrategy(key, out var strategy).Should().BeTrue(); + registry.TryGetPipeline(key, out var strategy).Should().BeTrue(); - strategy.Should().BeSameAs(expectedStrategy); + strategy.Should().BeSameAs(expectedPipeline); } [Fact] - public void TryGet_GenericExplicitStrategyAdded_Ok() + public void TryGet_GenericExplicitPipelineAdded_Ok() { - var expectedStrategy = new TestResilienceStrategy(); + var expectedPipeline = new TestResiliencePipeline(); var registry = CreateRegistry(); var key = StrategyId.Create("A", "Instance"); - registry.TryAddStrategy(key, expectedStrategy).Should().BeTrue(); + registry.TryAddPipeline(key, expectedPipeline).Should().BeTrue(); - registry.TryGetStrategy(key, out var strategy).Should().BeTrue(); + registry.TryGetPipeline(key, out var strategy).Should().BeTrue(); - strategy.Should().BeSameAs(expectedStrategy); + strategy.Should().BeSameAs(expectedPipeline); } [Fact] public void TryAdd_Twice_SecondNotAdded() { - var expectedStrategy = new TestResilienceStrategy().AsStrategy(); + var expectedPipeline = new TestResilienceStrategy().AsPipeline(); var registry = CreateRegistry(); var key = StrategyId.Create("A", "Instance"); - registry.TryAddStrategy(key, expectedStrategy).Should().BeTrue(); + registry.TryAddPipeline(key, expectedPipeline).Should().BeTrue(); - registry.TryAddStrategy(key, new TestResilienceStrategy().AsStrategy()).Should().BeFalse(); + registry.TryAddPipeline(key, new TestResilienceStrategy().AsPipeline()).Should().BeFalse(); - registry.TryGetStrategy(key, out var strategy).Should().BeTrue(); - strategy.Should().BeSameAs(expectedStrategy); + registry.TryGetPipeline(key, out var strategy).Should().BeTrue(); + strategy.Should().BeSameAs(expectedPipeline); } [Fact] public void TryAdd_GenericTwice_SecondNotAdded() { - var expectedStrategy = new TestResilienceStrategy(); + var expectedPipeline = new TestResiliencePipeline(); var registry = CreateRegistry(); var key = StrategyId.Create("A", "Instance"); - registry.TryAddStrategy(key, expectedStrategy).Should().BeTrue(); + registry.TryAddPipeline(key, expectedPipeline).Should().BeTrue(); - registry.TryAddStrategy(key, new TestResilienceStrategy()).Should().BeFalse(); + registry.TryAddPipeline(key, new TestResiliencePipeline()).Should().BeFalse(); - registry.TryGetStrategy(key, out var strategy).Should().BeTrue(); - strategy.Should().BeSameAs(expectedStrategy); + registry.TryGetPipeline(key, out var strategy).Should().BeTrue(); + strategy.Should().BeSameAs(expectedPipeline); } [Fact] @@ -359,7 +359,7 @@ public void EnableReloads_Ok() { // arrange var retryCount = 2; - var registry = new ResilienceStrategyRegistry(); + var registry = new ResiliencePipelineRegistry(); using var changeSource = new CancellationTokenSource(); registry.TryAddBuilder("dummy", (builder, context) => @@ -376,7 +376,7 @@ public void EnableReloads_Ok() }); // act - var strategy = registry.GetStrategy("dummy"); + var strategy = registry.GetPipeline("dummy"); // assert var tries = 0; @@ -395,7 +395,7 @@ public void EnableReloads_Generic_Ok() { // arrange var retryCount = 2; - var registry = new ResilienceStrategyRegistry(); + var registry = new ResiliencePipelineRegistry(); using var changeSource = new CancellationTokenSource(); registry.TryAddBuilder("dummy", (builder, context) => @@ -412,7 +412,7 @@ public void EnableReloads_Generic_Ok() }); // act - var strategy = registry.GetStrategy("dummy"); + var strategy = registry.GetPipeline("dummy"); // assert var tries = 0; @@ -427,32 +427,32 @@ public void EnableReloads_Generic_Ok() } [Fact] - public void GetOrAddStrategy_Ok() + public void GetOrAddPipeline_Ok() { var id = new StrategyId(typeof(string), "A"); var called = 0; var registry = CreateRegistry(); - var strategy = registry.GetOrAddStrategy(id, builder => { builder.AddTimeout(TimeSpan.FromSeconds(1)); called++; }); - var otherStrategy = registry.GetOrAddStrategy(id, builder => { builder.AddTimeout(TimeSpan.FromSeconds(1)); called++; }); + var strategy = registry.GetOrAddPipeline(id, builder => { builder.AddTimeout(TimeSpan.FromSeconds(1)); called++; }); + var otherPipeline = registry.GetOrAddPipeline(id, builder => { builder.AddTimeout(TimeSpan.FromSeconds(1)); called++; }); - strategy.GetInnerStrategies().FirstStrategy.StrategyInstance.Should().BeOfType(); + strategy.GetPipelineDescriptor().FirstStrategy.StrategyInstance.Should().BeOfType(); called.Should().Be(1); } [Fact] - public void GetOrAddStrategy_Generic_Ok() + public void GetOrAddPipeline_Generic_Ok() { var id = new StrategyId(typeof(string), "A"); var called = 0; var registry = CreateRegistry(); - var strategy = registry.GetOrAddStrategy(id, builder => { builder.AddTimeout(TimeSpan.FromSeconds(1)); called++; }); - var otherStrategy = registry.GetOrAddStrategy(id, builder => { builder.AddTimeout(TimeSpan.FromSeconds(1)); called++; }); + var strategy = registry.GetOrAddPipeline(id, builder => { builder.AddTimeout(TimeSpan.FromSeconds(1)); called++; }); + var otherPipeline = registry.GetOrAddPipeline(id, builder => { builder.AddTimeout(TimeSpan.FromSeconds(1)); called++; }); - strategy.GetInnerStrategies().FirstStrategy.StrategyInstance.Should().BeOfType(); + strategy.GetPipelineDescriptor().FirstStrategy.StrategyInstance.Should().BeOfType(); } - private ResilienceStrategyRegistry CreateRegistry() => new(_options); + private ResiliencePipelineRegistry CreateRegistry() => new(_options); } diff --git a/test/Polly.Core.Tests/Registry/ResilienceStrategyProviderTests.cs b/test/Polly.Core.Tests/Registry/ResilienceStrategyProviderTests.cs deleted file mode 100644 index d5abfe3aac2..00000000000 --- a/test/Polly.Core.Tests/Registry/ResilienceStrategyProviderTests.cs +++ /dev/null @@ -1,63 +0,0 @@ -using System.Diagnostics.CodeAnalysis; -using Polly.Registry; - -namespace Polly.Core.Tests.Registry; - -public class ResilienceStrategyProviderTests -{ - [Fact] - public void Get_DoesNotExist_Throws() - { - new Provider() - .Invoking(o => o.GetStrategy("not-exists")) - .Should() - .Throw() - .WithMessage("Unable to find a resilience strategy associated with the key 'not-exists'. Please ensure that either the resilience strategy or the builder is registered."); - } - - [Fact] - public void Get_GenericDoesNotExist_Throws() - { - new Provider() - .Invoking(o => o.GetStrategy("not-exists")) - .Should() - .Throw() - .WithMessage("Unable to find a generic resilience strategy of 'String' associated with the key 'not-exists'. " + - "Please ensure that either the generic resilience strategy or the generic builder is registered."); - } - - [Fact] - public void Get_Exist_Ok() - { - var provider = new Provider { Strategy = new TestResilienceStrategy().AsStrategy() }; - - provider.GetStrategy("exists").Should().Be(provider.Strategy); - } - - [Fact] - public void Get_GenericExist_Ok() - { - var provider = new Provider { GenericStrategy = new TestResilienceStrategy() }; - - provider.GetStrategy("exists").Should().Be(provider.GenericStrategy); - } - - private class Provider : ResilienceStrategyProvider - { - public ResilienceStrategy? Strategy { get; set; } - - public object? GenericStrategy { get; set; } - - public override bool TryGetStrategy(string key, [NotNullWhen(true)] out ResilienceStrategy? strategy) - { - strategy = Strategy; - return Strategy != null; - } - - public override bool TryGetStrategy(string key, [NotNullWhen(true)] out ResilienceStrategy? strategy) - { - strategy = (ResilienceStrategy?)GenericStrategy; - return GenericStrategy != null; - } - } -} diff --git a/test/Polly.Core.Tests/CompositeStrategyBuilderTests.cs b/test/Polly.Core.Tests/ResiliencePipelineBuilderTests.cs similarity index 75% rename from test/Polly.Core.Tests/CompositeStrategyBuilderTests.cs rename to test/Polly.Core.Tests/ResiliencePipelineBuilderTests.cs index e6e50ba898c..68c55db01ba 100644 --- a/test/Polly.Core.Tests/CompositeStrategyBuilderTests.cs +++ b/test/Polly.Core.Tests/ResiliencePipelineBuilderTests.cs @@ -7,12 +7,12 @@ namespace Polly.Core.Tests; -public class CompositeStrategyBuilderTests +public class ResiliencePipelineBuilderTests { [Fact] public void Ctor_EnsureDefaults() { - var builder = new CompositeStrategyBuilder(); + var builder = new ResiliencePipelineBuilder(); builder.Name.Should().BeNull(); builder.Properties.Should().NotBeNull(); @@ -23,7 +23,7 @@ public void Ctor_EnsureDefaults() [Fact] public void CopyCtor_Ok() { - var builder = new CompositeStrategyBuilder + var builder = new ResiliencePipelineBuilder { TimeProvider = Substitute.For(), Name = "dummy", @@ -33,7 +33,7 @@ public void CopyCtor_Ok() builder.Properties.Set(new ResiliencePropertyKey("dummy"), "dummy"); - var other = new CompositeStrategyBuilder(builder); + var other = new ResiliencePipelineBuilder(builder); other.Name.Should().Be(builder.Name); other.TimeProvider.Should().Be(builder.TimeProvider); other.Randomizer.Should().BeSameAs(builder.Randomizer); @@ -42,18 +42,18 @@ public void CopyCtor_Ok() } [Fact] - public void AddStrategy_Single_Ok() + public void AddPipeline_Single_Ok() { // arrange var executions = new List(); - var builder = new CompositeStrategyBuilder(); + var builder = new ResiliencePipelineBuilder(); var first = new TestResilienceStrategy { Before = (_, _) => executions.Add(1), After = (_, _) => executions.Add(3), }; - builder.AddStrategy(first.AsStrategy()); + builder.AddPipeline(first.AsPipeline()); // act var strategy = builder.Build(); @@ -61,17 +61,17 @@ public void AddStrategy_Single_Ok() // assert strategy.Execute(_ => executions.Add(2)); - strategy.GetInnerStrategies().FirstStrategy.StrategyInstance.Should().BeOfType(); + strategy.GetPipelineDescriptor().FirstStrategy.StrategyInstance.Should().BeOfType(); executions.Should().BeInAscendingOrder(); executions.Should().HaveCount(3); } [Fact] - public void AddStrategy_Multiple_Ok() + public void AddPipeline_Multiple_Ok() { // arrange var executions = new List(); - var builder = new CompositeStrategyBuilder(); + var builder = new ResiliencePipelineBuilder(); var first = new TestResilienceStrategy { Before = (_, _) => executions.Add(1), @@ -88,15 +88,15 @@ public void AddStrategy_Multiple_Ok() After = (_, _) => executions.Add(5), }; - builder.AddStrategy(first.AsStrategy()); - builder.AddStrategy(second.AsStrategy()); - builder.AddStrategy(third.AsStrategy()); + builder.AddPipeline(first.AsPipeline()); + builder.AddPipeline(second.AsPipeline()); + builder.AddPipeline(third.AsPipeline()); // act var strategy = builder.Build(); strategy .Should() - .BeOfType() + .BeOfType() .Subject .Strategies.Should().HaveCount(3); @@ -108,13 +108,13 @@ public void AddStrategy_Multiple_Ok() } [Fact] - public void AddStrategy_Duplicate_Throws() + public void AddPipeline_Duplicate_Throws() { // arrange var executions = new List(); - var builder = new CompositeStrategyBuilder() - .AddStrategy(NullResilienceStrategy.Instance) - .AddStrategy(NullResilienceStrategy.Instance); + var builder = new ResiliencePipelineBuilder() + .AddPipeline(NullResiliencePipeline.Instance) + .AddPipeline(NullResiliencePipeline.Instance); builder.Invoking(b => b.Build()) .Should() @@ -125,7 +125,7 @@ public void AddStrategy_Duplicate_Throws() [Fact] public void Validator_Ok() { - var builder = new CompositeStrategyBuilder(); + var builder = new ResiliencePipelineBuilder(); builder.Validator.Should().NotBeNull(); @@ -143,11 +143,11 @@ The field RetryCount must be between 1 and 2147483647. } [Fact] - public void AddStrategy_MultipleNonDelegating_Ok() + public void AddPipeline_MultipleNonDelegating_Ok() { // arrange var executions = new List(); - var builder = new CompositeStrategyBuilder(); + var builder = new ResiliencePipelineBuilder(); var first = new Strategy { Before = () => executions.Add(1), @@ -164,9 +164,9 @@ public void AddStrategy_MultipleNonDelegating_Ok() After = () => executions.Add(5), }; - builder.AddStrategy(first.AsStrategy()); - builder.AddStrategy(second.AsStrategy()); - builder.AddStrategy(third.AsStrategy()); + builder.AddPipeline(first.AsPipeline()); + builder.AddPipeline(second.AsPipeline()); + builder.AddPipeline(third.AsPipeline()); // act var strategy = builder.Build(); @@ -179,33 +179,33 @@ public void AddStrategy_MultipleNonDelegating_Ok() } [Fact] - public void Build_Empty_ReturnsNullResilienceStrategy() => new CompositeStrategyBuilder().Build().Should().BeSameAs(NullResilienceStrategy.Instance); + public void Build_Empty_ReturnsNullResiliencePipeline() => new ResiliencePipelineBuilder().Build().Should().BeSameAs(NullResiliencePipeline.Instance); [Fact] - public void AddStrategy_AfterUsed_Throws() + public void AddPipeline_AfterUsed_Throws() { - var builder = new CompositeStrategyBuilder(); + var builder = new ResiliencePipelineBuilder(); builder.Build(); builder - .Invoking(b => b.AddStrategy(NullResilienceStrategy.Instance)) + .Invoking(b => b.AddPipeline(NullResiliencePipeline.Instance)) .Should() .Throw() - .WithMessage("Cannot add any more resilience strategies to the builder after it has been used to build a strategy once."); + .WithMessage("Cannot add any more resilience strategies to the builder after it has been used to build a pipeline once."); } [Fact] public void Build_InvalidBuilderOptions_Throw() { - var builder = new InvalidCompositeStrategyBuilder(); + var builder = new InvalidResiliencePipelineBuilder(); - builder.Invoking(b => b.BuildStrategy()) + builder.Invoking(b => b.BuildPipeline()) .Should() .Throw() .WithMessage( """ -The 'CompositeStrategyBuilder' configuration is invalid. +The 'ResiliencePipelineBuilder' configuration is invalid. Validation Errors: The RequiredProperty field is required. @@ -213,17 +213,17 @@ The RequiredProperty field is required. } [Fact] - public void AddStrategy_InvalidOptions_Throws() + public void AddPipeline_InvalidOptions_Throws() { - var builder = new CompositeStrategyBuilder(); + var builder = new ResiliencePipelineBuilder(); builder - .Invoking(b => b.AddStrategy(_ => new TestResilienceStrategy(), new InvalidResilienceStrategyOptions())) + .Invoking(b => b.AddStrategy(_ => new TestResilienceStrategy(), new InvalidResiliencePipelineOptions())) .Should() .Throw() .WithMessage( """ -The 'InvalidResilienceStrategyOptions' are invalid. +The 'InvalidResiliencePipelineOptions' are invalid. Validation Errors: The RequiredProperty field is required. @@ -231,12 +231,12 @@ The RequiredProperty field is required. } [Fact] - public void AddStrategy_NullFactory_Throws() + public void AddPipeline_NullFactory_Throws() { - var builder = new CompositeStrategyBuilder(); + var builder = new ResiliencePipelineBuilder(); builder - .Invoking(b => b.AddStrategy((Func)null!, new TestResilienceStrategyOptions())) + .Invoking(b => b.AddStrategy((Func)null!, new TestResilienceStrategyOptions())) .Should() .Throw() .And.ParamName @@ -244,7 +244,7 @@ public void AddStrategy_NullFactory_Throws() .Be("factory"); builder - .Invoking(b => b.AddStrategy((Func>)null!, new TestResilienceStrategyOptions())) + .Invoking(b => b.AddStrategy((Func>)null!, new TestResilienceStrategyOptions())) .Should() .Throw() .And.ParamName @@ -253,7 +253,7 @@ public void AddStrategy_NullFactory_Throws() } [Fact] - public void AddStrategy_CombinePipelines_Ok() + public void AddPipeline_CombinePipelines_Ok() { // arrange var executions = new List(); @@ -268,17 +268,17 @@ public void AddStrategy_CombinePipelines_Ok() After = (_, _) => executions.Add(6), }; - var pipeline1 = new CompositeStrategyBuilder().AddStrategy(first.AsStrategy()).AddStrategy(second.AsStrategy()).Build(); + var pipeline1 = new ResiliencePipelineBuilder().AddPipeline(first.AsPipeline()).AddPipeline(second.AsPipeline()).Build(); var third = new TestResilienceStrategy { Before = (_, _) => executions.Add(3), After = (_, _) => executions.Add(5), }; - var pipeline2 = new CompositeStrategyBuilder().AddStrategy(third.AsStrategy()).Build(); + var pipeline2 = new ResiliencePipelineBuilder().AddPipeline(third.AsPipeline()).Build(); // act - var strategy = new CompositeStrategyBuilder().AddStrategy(pipeline1).AddStrategy(pipeline2).Build(); + var strategy = new ResiliencePipelineBuilder().AddPipeline(pipeline1).AddPipeline(pipeline2).Build(); // assert strategy.Execute(_ => executions.Add(4)); @@ -288,13 +288,13 @@ public void AddStrategy_CombinePipelines_Ok() } [Fact] - public void BuildStrategy_EnsureCorrectContext() + public void Build_EnsureCorrectContext() { // arrange var verified1 = false; var verified2 = false; - var builder = new CompositeStrategyBuilder + var builder = new ResiliencePipelineBuilder { Name = "builder-name", TimeProvider = new FakeTimeProvider(), @@ -338,7 +338,7 @@ public void BuildStrategy_EnsureCorrectContext() } [Fact] - public void EmptyOptions_Ok() => CompositeStrategyBuilderExtensions.EmptyOptions.Instance.Name.Should().BeNull(); + public void EmptyOptions_Ok() => ResiliencePipelineBuilderExtensions.EmptyOptions.Instance.Name.Should().BeNull(); [Fact] public void ExecuteAsync_EnsureReceivedCallbackExecutesNextStrategy() @@ -349,21 +349,21 @@ public void ExecuteAsync_EnsureReceivedCallbackExecutesNextStrategy() { Before = (_, _) => executions.Add("first-start"), After = (_, _) => executions.Add("first-end"), - }.AsStrategy(); + }.AsPipeline(); var second = new ExecuteCallbackTwiceStrategy { Before = () => executions.Add("second-start"), After = () => executions.Add("second-end"), - }.AsStrategy(); + }.AsPipeline(); var third = new TestResilienceStrategy { Before = (_, _) => executions.Add("third-start"), After = (_, _) => executions.Add("third-end"), - }.AsStrategy(); + }.AsPipeline(); - var strategy = new CompositeStrategyBuilder().AddStrategy(first).AddStrategy(second).AddStrategy(third).Build(); + var strategy = new ResiliencePipelineBuilder().AddPipeline(first).AddPipeline(second).AddPipeline(third).Build(); // act strategy.Execute(_ => executions.Add("execute")); @@ -386,7 +386,7 @@ public void ExecuteAsync_EnsureReceivedCallbackExecutesNextStrategy() .BeTrue(); } - private class Strategy : NonReactiveResilienceStrategy + private class Strategy : ResilienceStrategy { public Action? Before { get; set; } @@ -409,7 +409,7 @@ protected internal override async ValueTask> ExecuteCore> ExecuteCore, ValueTask>> ExecuteAsyncGenericStrategyData = new() + public static TheoryData, ValueTask>> ExecuteAsyncGenericStrategyData = new() { async strategy => { @@ -61,9 +61,9 @@ public partial class ResilienceStrategyTests [MemberData(nameof(ExecuteAsyncGenericStrategyData))] [Theory] - public async Task ExecuteAsync_GenericStrategy_Ok(Func, ValueTask> execute) + public async Task ExecuteAsync_GenericStrategy_Ok(Func, ValueTask> execute) { - var strategy = new ResilienceStrategy(new TestResilienceStrategy + var strategy = new ResiliencePipeline(new TestResilienceStrategy { Before = (c, _) => { @@ -71,7 +71,7 @@ public async Task ExecuteAsync_GenericStrategy_Ok(Func.Instance.ExecuteOutcomeAsync((context, state) => + var result = await NullResiliencePipeline.Instance.ExecuteOutcomeAsync((context, state) => { state.Should().Be("state"); context.IsSynchronous.Should().BeFalse(); diff --git a/test/Polly.Core.Tests/ResilienceStrategyTTests.Sync.cs b/test/Polly.Core.Tests/ResiliencePipelineTTests.Sync.cs similarity index 88% rename from test/Polly.Core.Tests/ResilienceStrategyTTests.Sync.cs rename to test/Polly.Core.Tests/ResiliencePipelineTTests.Sync.cs index c28e7e1e902..20cfa9ac3a6 100644 --- a/test/Polly.Core.Tests/ResilienceStrategyTTests.Sync.cs +++ b/test/Polly.Core.Tests/ResiliencePipelineTTests.Sync.cs @@ -1,8 +1,8 @@ namespace Polly.Core.Tests; -public partial class ResilienceStrategyTests +public partial class ResiliencePipelineTests { - public static TheoryData>> ExecuteGenericStrategyData = new() + public static TheoryData>> ExecuteGenericStrategyData = new() { strategy => { @@ -75,16 +75,16 @@ public partial class ResilienceStrategyTests [MemberData(nameof(ExecuteGenericStrategyData))] [Theory] - public void Execute_GenericStrategy_Ok(Action> execute) + public void Execute_GenericStrategy_Ok(Action> execute) { - var strategy = new ResilienceStrategy(new TestResilienceStrategy + var strategy = new ResiliencePipeline(new TestResilienceStrategy { Before = (c, _) => { c.IsSynchronous.Should().BeTrue(); c.ResultType.Should().Be(typeof(string)); }, - }.AsStrategy()); + }.AsPipeline()); execute(strategy); } diff --git a/test/Polly.Core.Tests/ResilienceStrategyTests.Async.cs b/test/Polly.Core.Tests/ResiliencePipelineTests.Async.cs similarity index 94% rename from test/Polly.Core.Tests/ResilienceStrategyTests.Async.cs rename to test/Polly.Core.Tests/ResiliencePipelineTests.Async.cs index 190fb5b2a87..a8db8a72ad4 100644 --- a/test/Polly.Core.Tests/ResilienceStrategyTests.Async.cs +++ b/test/Polly.Core.Tests/ResiliencePipelineTests.Async.cs @@ -2,7 +2,7 @@ namespace Polly.Core.Tests; #pragma warning disable CS1998 // Async method lacks 'await' operators and will run synchronously -public partial class ResilienceStrategyTests +public partial class ResiliencePipelineTests { public static IEnumerable ExecuteAsync_EnsureCorrectBehavior_Data() { @@ -78,7 +78,7 @@ public async Task ExecuteAsync_Ok(ExecuteParameters parameters) context = c; parameters.AssertContext(c); }, - }.AsStrategy(); + }.AsPipeline(); var result = await parameters.Execute(strategy); @@ -94,9 +94,9 @@ public async Task ExecuteAsync_EnsureCallStackPreserved() await AssertStackTrace(s => s.ExecuteAsync((_, _) => MyThrowingMethod(), ResilienceContextPool.Shared.Get(), "state")); await AssertStackTrace(s => s.ExecuteAsync((_, _) => MyThrowingMethod(), "state")); - static async ValueTask AssertStackTrace(Func execute) + static async ValueTask AssertStackTrace(Func execute) { - var strategy = new TestResilienceStrategy().AsStrategy(); + var strategy = new TestResilienceStrategy().AsPipeline(); var error = await strategy .Invoking(s => diff --git a/test/Polly.Core.Tests/ResilienceStrategyTests.AsyncT.cs b/test/Polly.Core.Tests/ResiliencePipelineTests.AsyncT.cs similarity index 92% rename from test/Polly.Core.Tests/ResilienceStrategyTests.AsyncT.cs rename to test/Polly.Core.Tests/ResiliencePipelineTests.AsyncT.cs index cca7b3c2b7c..71a7c06a896 100644 --- a/test/Polly.Core.Tests/ResilienceStrategyTests.AsyncT.cs +++ b/test/Polly.Core.Tests/ResiliencePipelineTests.AsyncT.cs @@ -2,7 +2,7 @@ namespace Polly.Core.Tests; #pragma warning disable CS1998 // Async method lacks 'await' operators and will run synchronously -public partial class ResilienceStrategyTests +public partial class ResiliencePipelineTests { public static IEnumerable ExecuteAsyncT_EnsureCorrectBehavior_Data() { @@ -82,7 +82,7 @@ public async Task ExecuteAsyncT_Ok(ExecuteParameters parameters) }, }; - var result = await parameters.Execute(strategy.AsStrategy()); + var result = await parameters.Execute(strategy.AsPipeline()); parameters.AssertContextAfter(context!); parameters.AssertResult(result); @@ -96,9 +96,9 @@ public async Task ExecuteAsync_T_EnsureCallStackPreserved() await AssertStackTrace(s => s.ExecuteAsync((_, _) => MyThrowingMethod(), ResilienceContextPool.Shared.Get(), "state")); await AssertStackTrace(s => s.ExecuteAsync((_, _) => MyThrowingMethod(), "state")); - static async ValueTask AssertStackTrace(Func> execute) + static async ValueTask AssertStackTrace(Func> execute) { - var strategy = new TestResilienceStrategy().AsStrategy(); + var strategy = new TestResilienceStrategy().AsPipeline(); var error = await strategy .Invoking(s => @@ -117,7 +117,7 @@ static async ValueTask AssertStackTrace(Func + var result = await NullResiliencePipeline.Instance.ExecuteOutcomeAsync((context, state) => { state.Should().Be("state"); context.IsSynchronous.Should().BeFalse(); diff --git a/test/Polly.Core.Tests/ResilienceStrategyTests.Sync.cs b/test/Polly.Core.Tests/ResiliencePipelineTests.Sync.cs similarity index 95% rename from test/Polly.Core.Tests/ResilienceStrategyTests.Sync.cs rename to test/Polly.Core.Tests/ResiliencePipelineTests.Sync.cs index 004d4638bc3..1de7720e80c 100644 --- a/test/Polly.Core.Tests/ResilienceStrategyTests.Sync.cs +++ b/test/Polly.Core.Tests/ResiliencePipelineTests.Sync.cs @@ -1,6 +1,6 @@ namespace Polly.Core.Tests; -public partial class ResilienceStrategyTests +public partial class ResiliencePipelineTests { public static IEnumerable Execute_EnsureCorrectBehavior_Data() { @@ -82,7 +82,7 @@ public async Task Execute_Ok(ExecuteParameters parameters) context = c; parameters.AssertContext(c); }, - }.AsStrategy(); + }.AsPipeline(); var result = await parameters.Execute(strategy); @@ -101,9 +101,9 @@ public void Execute_EnsureCallStackPreserved() AssertStackTrace(s => s.Execute((_, _) => MyThrowingMethod(), "state")); AssertStackTrace(s => s.Execute((_) => MyThrowingMethod(), "state")); - static void AssertStackTrace(Action execute) + static void AssertStackTrace(Action execute) { - var strategy = new TestResilienceStrategy().AsStrategy(); + var strategy = new TestResilienceStrategy().AsPipeline(); var error = strategy .Invoking(s => execute(s)) diff --git a/test/Polly.Core.Tests/ResilienceStrategyTests.SyncT.cs b/test/Polly.Core.Tests/ResiliencePipelineTests.SyncT.cs similarity index 95% rename from test/Polly.Core.Tests/ResilienceStrategyTests.SyncT.cs rename to test/Polly.Core.Tests/ResiliencePipelineTests.SyncT.cs index 670cc7600e7..64317fdf2c1 100644 --- a/test/Polly.Core.Tests/ResilienceStrategyTests.SyncT.cs +++ b/test/Polly.Core.Tests/ResiliencePipelineTests.SyncT.cs @@ -1,6 +1,6 @@ namespace Polly.Core.Tests; -public partial class ResilienceStrategyTests +public partial class ResiliencePipelineTests { public static IEnumerable ExecuteT_EnsureCorrectBehavior_Data() { @@ -84,7 +84,7 @@ public async Task ExecuteT_Ok(ExecuteParameters parameters) context = c; parameters.AssertContext(c); }, - }.AsStrategy(); + }.AsPipeline(); var result = await parameters.Execute(strategy); @@ -103,9 +103,9 @@ public void Execute_T_EnsureCallStackPreserved() AssertStackTrace(s => s.Execute((_, _) => MyThrowingMethod(), "state")); AssertStackTrace(s => s.Execute((_) => MyThrowingMethod(), "state")); - static void AssertStackTrace(Func execute) + static void AssertStackTrace(Func execute) { - var strategy = new TestResilienceStrategy().AsStrategy(); + var strategy = new TestResilienceStrategy().AsPipeline(); var error = strategy .Invoking(s => execute(s)) diff --git a/test/Polly.Core.Tests/ResilienceStrategyTests.cs b/test/Polly.Core.Tests/ResiliencePipelineTests.cs similarity index 77% rename from test/Polly.Core.Tests/ResilienceStrategyTests.cs rename to test/Polly.Core.Tests/ResiliencePipelineTests.cs index 9e64afdc4df..55af7923078 100644 --- a/test/Polly.Core.Tests/ResilienceStrategyTests.cs +++ b/test/Polly.Core.Tests/ResiliencePipelineTests.cs @@ -2,25 +2,25 @@ namespace Polly.Core.Tests; -public partial class ResilienceStrategyTests +public partial class ResiliencePipelineTests { public static readonly CancellationToken CancellationToken = new CancellationTokenSource().Token; [Fact] public void DebuggerProxy_Ok() { - var pipeline = CompositeResilienceStrategy.Create(new[] + var pipeline = CompositeResiliencePipeline.Create(new[] { - new TestResilienceStrategy().AsStrategy(), - new TestResilienceStrategy().AsStrategy() + new TestResilienceStrategy().AsPipeline(), + new TestResilienceStrategy().AsPipeline() }, null!, null!); - new CompositeResilienceStrategy.DebuggerProxy(pipeline).Strategies.Should().HaveCount(2); + new CompositeResiliencePipeline.DebuggerProxy(pipeline).Strategies.Should().HaveCount(2); } public class ExecuteParameters : ExecuteParameters { - public ExecuteParameters(Func> execute, T resultValue) + public ExecuteParameters(Func> execute, T resultValue) { Execute = async strategy => { @@ -31,7 +31,7 @@ public ExecuteParameters(Func> execute, T resultValu AssertResult = result => result.Should().BeOfType().And.Be(resultValue); } - public ExecuteParameters(Func> execute, T resultValue) + public ExecuteParameters(Func> execute, T resultValue) { Execute = async strategy => { @@ -42,7 +42,7 @@ public ExecuteParameters(Func> execute, T resul AssertResult = result => result.Should().BeOfType().And.Be(resultValue); } - public ExecuteParameters(Func execute, T resultValue) + public ExecuteParameters(Func execute, T resultValue) { Execute = strategy => new ValueTask(execute(strategy)!); AssertResult = result => result.Should().BeOfType().And.Be(resultValue); @@ -55,7 +55,7 @@ public ExecuteParameters() { } - public ExecuteParameters(Func execute) + public ExecuteParameters(Func execute) { Execute = async r => { @@ -66,7 +66,7 @@ public ExecuteParameters(Func execute) AssertResult = r => r.Should().Be(VoidResult.Instance); } - public ExecuteParameters(Func execute) + public ExecuteParameters(Func execute) { Execute = async r => { @@ -77,7 +77,7 @@ public ExecuteParameters(Func execute) AssertResult = r => r.Should().Be(VoidResult.Instance); } - public ExecuteParameters(Action execute) + public ExecuteParameters(Action execute) { Execute = r => { @@ -88,7 +88,7 @@ public ExecuteParameters(Action execute) AssertResult = r => r.Should().Be(VoidResult.Instance); } - public Func> Execute { get; set; } = r => new ValueTask(VoidResult.Instance); + public Func> Execute { get; set; } = r => new ValueTask(VoidResult.Instance); public Action AssertContext { get; set; } = _ => { }; diff --git a/test/Polly.Core.Tests/Retry/RetryCompositeStrategyBuilderExtensionsTests.cs b/test/Polly.Core.Tests/Retry/RetryResiliencePipelineBuilderExtensionsTests.cs similarity index 75% rename from test/Polly.Core.Tests/Retry/RetryCompositeStrategyBuilderExtensionsTests.cs rename to test/Polly.Core.Tests/Retry/RetryResiliencePipelineBuilderExtensionsTests.cs index 54f4aa8ea75..9f0531e197d 100644 --- a/test/Polly.Core.Tests/Retry/RetryCompositeStrategyBuilderExtensionsTests.cs +++ b/test/Polly.Core.Tests/Retry/RetryResiliencePipelineBuilderExtensionsTests.cs @@ -6,9 +6,9 @@ namespace Polly.Core.Tests.Retry; #pragma warning disable CA2012 // Use ValueTasks correctly -public class RetryCompositeStrategyBuilderExtensionsTests +public class RetryResiliencePipelineBuilderExtensionsTests { - public static readonly TheoryData> OverloadsData = new() + public static readonly TheoryData> OverloadsData = new() { builder => { @@ -24,7 +24,7 @@ public class RetryCompositeStrategyBuilderExtensionsTests } }; - public static readonly TheoryData>> OverloadsDataGeneric = new() + public static readonly TheoryData>> OverloadsDataGeneric = new() { builder => { @@ -42,18 +42,18 @@ public class RetryCompositeStrategyBuilderExtensionsTests [MemberData(nameof(OverloadsData))] [Theory] - public void AddRetry_Overloads_Ok(Action configure) + public void AddRetry_Overloads_Ok(Action configure) { - var builder = new CompositeStrategyBuilder(); + var builder = new ResiliencePipelineBuilder(); builder.Invoking(b => configure(b)).Should().NotThrow(); } [MemberData(nameof(OverloadsDataGeneric))] [Theory] - public void AddRetry_GenericOverloads_Ok(Action> configure) + public void AddRetry_GenericOverloads_Ok(Action> configure) { - var builder = new CompositeStrategyBuilder(); + var builder = new ResiliencePipelineBuilder(); builder.Invoking(b => configure(b)).Should().NotThrow(); } @@ -61,7 +61,7 @@ public void AddRetry_GenericOverloads_Ok(Action> c [Fact] public void AddRetry_DefaultOptions_Ok() { - var builder = new CompositeStrategyBuilder(); + var builder = new ResiliencePipelineBuilder(); var options = new RetryStrategyOptions { ShouldHandle = _ => PredicateResult.True }; builder.AddRetry(options); @@ -69,9 +69,9 @@ public void AddRetry_DefaultOptions_Ok() AssertStrategy(builder, options.BackoffType, options.RetryCount, options.BaseDelay); } - private static void AssertStrategy(CompositeStrategyBuilder builder, RetryBackoffType type, int retries, TimeSpan delay, Action>? assert = null) + private static void AssertStrategy(ResiliencePipelineBuilder builder, RetryBackoffType type, int retries, TimeSpan delay, Action>? assert = null) { - var strategy = builder.Build().GetInnerStrategies().FirstStrategy.StrategyInstance.Should().BeOfType>().Subject; + var strategy = builder.Build().GetPipelineDescriptor().FirstStrategy.StrategyInstance.Should().BeOfType>().Subject; strategy.BackoffType.Should().Be(type); strategy.RetryCount.Should().Be(retries); @@ -81,13 +81,13 @@ private static void AssertStrategy(CompositeStrategyBuilder builder, RetryBackof } private static void AssertStrategy( - CompositeStrategyBuilder builder, + ResiliencePipelineBuilder builder, RetryBackoffType type, int retries, TimeSpan delay, Action>? assert = null) { - var strategy = builder.Build().GetInnerStrategies().FirstStrategy.StrategyInstance.Should().BeOfType>().Subject; + var strategy = builder.Build().GetPipelineDescriptor().FirstStrategy.StrategyInstance.Should().BeOfType>().Subject; strategy.BackoffType.Should().Be(type); strategy.RetryCount.Should().Be(retries); @@ -99,12 +99,12 @@ private static void AssertStrategy( [Fact] public void AddRetry_InvalidOptions_Throws() { - new CompositeStrategyBuilder() + new ResiliencePipelineBuilder() .Invoking(b => b.AddRetry(new RetryStrategyOptions { ShouldHandle = null! })) .Should() .Throw(); - new CompositeStrategyBuilder() + new ResiliencePipelineBuilder() .Invoking(b => b.AddRetry(new RetryStrategyOptions { ShouldHandle = null! })) .Should() .Throw(); @@ -131,7 +131,7 @@ private static TimeSpan GetAggregatedDelay(RetryStrategyOptions options) { var aggregatedDelay = TimeSpan.Zero; - var strategy = new CompositeStrategyBuilder { Randomizer = () => 1.0 }.AddRetry(new() + var strategy = new ResiliencePipelineBuilder { Randomizer = () => 1.0 }.AddRetry(new() { RetryCount = options.RetryCount, BaseDelay = options.BaseDelay, diff --git a/test/Polly.Core.Tests/Retry/RetryResilienceStrategyTests.cs b/test/Polly.Core.Tests/Retry/RetryResilienceStrategyTests.cs index 1bbadbf297b..ca6b62a76a6 100644 --- a/test/Polly.Core.Tests/Retry/RetryResilienceStrategyTests.cs +++ b/test/Polly.Core.Tests/Retry/RetryResilienceStrategyTests.cs @@ -339,7 +339,7 @@ public void RetryDelayGenerator_EnsureCorrectArguments() private void SetupNoDelay() => _options.RetryDelayGenerator = _ => new ValueTask(TimeSpan.Zero); - private async ValueTask ExecuteAndAdvance(ReactiveResilienceStrategyBridge sut) + private async ValueTask ExecuteAndAdvance(ResiliencePipelineBridge sut) { var executing = sut.ExecuteAsync(_ => new ValueTask(0)).AsTask(); @@ -351,7 +351,7 @@ private async ValueTask ExecuteAndAdvance(ReactiveResilienceStrategyBridge< return await executing; } - private ReactiveResilienceStrategyBridge CreateSut(TimeProvider? timeProvider = null) => + private ResiliencePipelineBridge CreateSut(TimeProvider? timeProvider = null) => new(new RetryResilienceStrategy(_options, timeProvider ?? _timeProvider, _telemetry, diff --git a/test/Polly.Core.Tests/CompositeStrategyBuilderContextTests.cs b/test/Polly.Core.Tests/StrategyBuilderContextTests.cs similarity index 88% rename from test/Polly.Core.Tests/CompositeStrategyBuilderContextTests.cs rename to test/Polly.Core.Tests/StrategyBuilderContextTests.cs index 6cc38877fcb..e652ef3282b 100644 --- a/test/Polly.Core.Tests/CompositeStrategyBuilderContextTests.cs +++ b/test/Polly.Core.Tests/StrategyBuilderContextTests.cs @@ -3,7 +3,7 @@ namespace Polly.Core.Tests; -public class CompositeStrategyBuilderContextTests +public class StrategyBuilderContextTests { [Fact] public void Ctor_EnsureDefaults() @@ -20,7 +20,7 @@ public void Ctor_EnsureDefaults() context.Telemetry.Should().NotBeNull(); context.Randomizer.Should().NotBeNull(); - context.Telemetry.TelemetrySource.BuilderName.Should().Be("builder-name"); + context.Telemetry.TelemetrySource.PipelineName.Should().Be("builder-name"); context.Telemetry.TelemetrySource.BuilderProperties.Should().BeSameAs(properties); context.Telemetry.TelemetrySource.StrategyName.Should().Be("strategy-name"); } diff --git a/test/Polly.Core.Tests/Telemetry/ResilienceStrategyTelemetryTests.cs b/test/Polly.Core.Tests/Telemetry/ResilienceStrategyTelemetryTests.cs index 446418be4e9..991bb8d67c2 100644 --- a/test/Polly.Core.Tests/Telemetry/ResilienceStrategyTelemetryTests.cs +++ b/test/Polly.Core.Tests/Telemetry/ResilienceStrategyTelemetryTests.cs @@ -52,7 +52,7 @@ public void Report_NoOutcomeWhenNotSubscribed_None() } [Fact] - public void ResilienceStrategyTelemetry_NoDiagnosticSource_Ok() + public void ResiliencePipelineTelemetry_NoDiagnosticSource_Ok() { var source = new ResilienceTelemetrySource("builder", "instance", new ResilienceProperties(), "strategy-name"); var sut = new ResilienceStrategyTelemetry(source, null); diff --git a/test/Polly.Core.Tests/Telemetry/TelemetryUtilTests.cs b/test/Polly.Core.Tests/Telemetry/TelemetryUtilTests.cs index 67e13f4e3f4..9cba39771dc 100644 --- a/test/Polly.Core.Tests/Telemetry/TelemetryUtilTests.cs +++ b/test/Polly.Core.Tests/Telemetry/TelemetryUtilTests.cs @@ -10,8 +10,8 @@ public void CreateResilienceTelemetry_Ok() { var telemetry = TelemetryUtil.CreateTelemetry(null, "builder", "instance", new ResilienceProperties(), "strategy-name"); - telemetry.TelemetrySource.BuilderName.Should().Be("builder"); - telemetry.TelemetrySource.BuilderInstanceName.Should().Be("instance"); + telemetry.TelemetrySource.PipelineName.Should().Be("builder"); + telemetry.TelemetrySource.PipelineInstanceName.Should().Be("instance"); telemetry.TelemetrySource.StrategyName.Should().Be("strategy-name"); telemetry.DiagnosticSource.Should().BeNull(); } diff --git a/test/Polly.Core.Tests/Timeout/TimeoutCompositeStrategyBuilderExtensionsTests.cs b/test/Polly.Core.Tests/Timeout/TimeoutResiliencePipelineBuilderExtensionsTests.cs similarity index 64% rename from test/Polly.Core.Tests/Timeout/TimeoutCompositeStrategyBuilderExtensionsTests.cs rename to test/Polly.Core.Tests/Timeout/TimeoutResiliencePipelineBuilderExtensionsTests.cs index 7a34b55376f..4e476f22c67 100644 --- a/test/Polly.Core.Tests/Timeout/TimeoutCompositeStrategyBuilderExtensionsTests.cs +++ b/test/Polly.Core.Tests/Timeout/TimeoutResiliencePipelineBuilderExtensionsTests.cs @@ -4,7 +4,7 @@ namespace Polly.Core.Tests.Timeout; -public class TimeoutCompositeStrategyBuilderExtensionsTests +public class TimeoutResiliencePipelineBuilderExtensionsTests { public static IEnumerable AddTimeout_Ok_Data() { @@ -12,7 +12,7 @@ public static IEnumerable AddTimeout_Ok_Data() yield return new object[] { timeout, - (CompositeStrategyBuilder builder) => { builder.AddTimeout(timeout); }, + (ResiliencePipelineBuilder builder) => { builder.AddTimeout(timeout); }, (TimeoutResilienceStrategy strategy) => { GetTimeout(strategy).Should().Be(timeout); } }; } @@ -21,19 +21,19 @@ public static IEnumerable AddTimeout_Ok_Data() [Theory] public void AddTimeout_InvalidTimeout_EnsureValidated(TimeSpan timeout) { - var builder = new CompositeStrategyBuilder(); + var builder = new ResiliencePipelineBuilder(); Assert.Throws(() => builder.AddTimeout(timeout)); } [MemberData(nameof(AddTimeout_Ok_Data))] [Theory] - internal void AddTimeout_Ok(TimeSpan timeout, Action> configure, Action assert) + internal void AddTimeout_Ok(TimeSpan timeout, Action> configure, Action assert) { - var builder = new CompositeStrategyBuilder(); + var builder = new ResiliencePipelineBuilder(); configure(builder); - var strategy = builder.Build().GetInnerStrategies().FirstStrategy.StrategyInstance.Should().BeOfType().Subject; + var strategy = builder.Build().GetPipelineDescriptor().FirstStrategy.StrategyInstance.Should().BeOfType().Subject; assert(strategy); GetTimeout(strategy).Should().Be(timeout); } @@ -41,15 +41,15 @@ internal void AddTimeout_Ok(TimeSpan timeout, Action(); + strategy.GetPipelineDescriptor().FirstStrategy.StrategyInstance.Should().BeOfType(); } [Fact] public void AddTimeout_InvalidOptions_Throws() { - new CompositeStrategyBuilder() + new ResiliencePipelineBuilder() .Invoking(b => b.AddTimeout(new TimeoutStrategyOptions { Timeout = TimeSpan.Zero })) .Should() .Throw(); diff --git a/test/Polly.Core.Tests/Timeout/TimeoutResilienceStrategyTests.cs b/test/Polly.Core.Tests/Timeout/TimeoutResilienceStrategyTests.cs index 435354b0ef4..2909c0311e7 100644 --- a/test/Polly.Core.Tests/Timeout/TimeoutResilienceStrategyTests.cs +++ b/test/Polly.Core.Tests/Timeout/TimeoutResilienceStrategyTests.cs @@ -233,5 +233,5 @@ await sut.ExecuteAsync(async token => private void SetTimeout(TimeSpan timeout) => _options.TimeoutGenerator = args => new ValueTask(timeout); - private ResilienceStrategy CreateSut() => new TimeoutResilienceStrategy(_options, _timeProvider, _telemetry).AsStrategy(); + private ResiliencePipeline CreateSut() => new TimeoutResilienceStrategy(_options, _timeProvider, _telemetry).AsPipeline(); } diff --git a/test/Polly.Core.Tests/Utils/CompositeResilienceStrategyTests.cs b/test/Polly.Core.Tests/Utils/CompositeResiliencePipelineTests.cs similarity index 74% rename from test/Polly.Core.Tests/Utils/CompositeResilienceStrategyTests.cs rename to test/Polly.Core.Tests/Utils/CompositeResiliencePipelineTests.cs index 5a6e56183f4..d1c37cddd09 100644 --- a/test/Polly.Core.Tests/Utils/CompositeResilienceStrategyTests.cs +++ b/test/Polly.Core.Tests/Utils/CompositeResiliencePipelineTests.cs @@ -5,23 +5,23 @@ namespace Polly.Core.Tests.Utils; -public class CompositeResilienceStrategyTests +public class CompositeResiliencePipelineTests { private readonly ResilienceStrategyTelemetry _telemetry; private Action? _onTelemetry; - public CompositeResilienceStrategyTests() + public CompositeResiliencePipelineTests() => _telemetry = TestUtilities.CreateResilienceTelemetry(args => _onTelemetry?.Invoke(args)); [Fact] public void Create_ArgValidation() { - Assert.Throws(() => CompositeResilienceStrategy.Create(null!, null!, null!)); - Assert.Throws(() => CompositeResilienceStrategy.Create(Array.Empty(), null!, null!)); - Assert.Throws(() => CompositeResilienceStrategy.Create(new ResilienceStrategy[] + Assert.Throws(() => CompositeResiliencePipeline.Create(null!, null!, null!)); + Assert.Throws(() => CompositeResiliencePipeline.Create(Array.Empty(), null!, null!)); + Assert.Throws(() => CompositeResiliencePipeline.Create(new ResiliencePipeline[] { - NullResilienceStrategy.Instance, - NullResilienceStrategy.Instance + NullResiliencePipeline.Instance, + NullResiliencePipeline.Instance }, null!, null!)); } @@ -30,9 +30,9 @@ public void Create_EnsureOriginalStrategiesPreserved() { var strategies = new[] { - new TestResilienceStrategy().AsStrategy(), - new Strategy().AsStrategy(), - new TestResilienceStrategy().AsStrategy(), + new TestResilienceStrategy().AsPipeline(), + new Strategy().AsPipeline(), + new TestResilienceStrategy().AsPipeline(), }; var pipeline = CreateSut(strategies); @@ -50,8 +50,8 @@ public async Task Create_EnsureExceptionsNotWrapped() { var strategies = new[] { - new Strategy().AsStrategy(), - new Strategy().AsStrategy(), + new Strategy().AsPipeline(), + new Strategy().AsPipeline(), }; var pipeline = CreateSut(strategies); @@ -66,16 +66,16 @@ public void Create_EnsurePipelineReusableAcrossDifferentPipelines() { var strategies = new[] { - new TestResilienceStrategy().AsStrategy(), - new Strategy().AsStrategy(), - new TestResilienceStrategy().AsStrategy(), + new TestResilienceStrategy().AsPipeline(), + new Strategy().AsPipeline(), + new TestResilienceStrategy().AsPipeline(), }; var pipeline = CreateSut(strategies); - CreateSut(new ResilienceStrategy[] { NullResilienceStrategy.Instance, pipeline }); + CreateSut(new ResiliencePipeline[] { NullResiliencePipeline.Instance, pipeline }); - this.Invoking(_ => CreateSut(new ResilienceStrategy[] { NullResilienceStrategy.Instance, pipeline })) + this.Invoking(_ => CreateSut(new ResiliencePipeline[] { NullResiliencePipeline.Instance, pipeline })) .Should() .NotThrow(); } @@ -87,8 +87,8 @@ public async Task Create_Cancelled_EnsureNoExecution() cancellation.Cancel(); var strategies = new[] { - new TestResilienceStrategy().AsStrategy(), - new TestResilienceStrategy().AsStrategy(), + new TestResilienceStrategy().AsPipeline(), + new TestResilienceStrategy().AsPipeline(), }; var pipeline = CreateSut(strategies, new FakeTimeProvider()); @@ -106,8 +106,8 @@ public async Task Create_CancelledLater_EnsureNoExecution() using var cancellation = new CancellationTokenSource(); var strategies = new[] { - new TestResilienceStrategy { Before = (_, _) => { executed = true; cancellation.Cancel(); } }.AsStrategy(), - new TestResilienceStrategy().AsStrategy(), + new TestResilienceStrategy { Before = (_, _) => { executed = true; cancellation.Cancel(); } }.AsPipeline(), + new TestResilienceStrategy().AsPipeline(), }; var pipeline = CreateSut(strategies, new FakeTimeProvider()); var context = ResilienceContextPool.Shared.Get(); @@ -134,7 +134,7 @@ public void ExecuptePipeline_EnsureTelemetryArgumentsReported() items.Add(args.Arguments); }; - var pipeline = CreateSut(new[] { new TestResilienceStrategy().AsStrategy() }, timeProvider); + var pipeline = CreateSut(new[] { new TestResilienceStrategy().AsPipeline() }, timeProvider); pipeline.Execute(() => { timeProvider.Advance(TimeSpan.FromHours(1)); }); items.Should().HaveCount(2); @@ -142,12 +142,12 @@ public void ExecuptePipeline_EnsureTelemetryArgumentsReported() items[1].Should().BeOfType(); } - private CompositeResilienceStrategy CreateSut(ResilienceStrategy[] strategies, TimeProvider? timeProvider = null) + private CompositeResiliencePipeline CreateSut(ResiliencePipeline[] strategies, TimeProvider? timeProvider = null) { - return CompositeResilienceStrategy.Create(strategies, _telemetry, timeProvider ?? Substitute.For()); + return CompositeResiliencePipeline.Create(strategies, _telemetry, timeProvider ?? Substitute.For()); } - private class Strategy : NonReactiveResilienceStrategy + private class Strategy : ResilienceStrategy { protected internal override async ValueTask> ExecuteCore( Func>> callback, diff --git a/test/Polly.Core.Tests/Utils/ReloadableResilienceStrategyTests.cs b/test/Polly.Core.Tests/Utils/ReloadableResiliencePipelineTests.cs similarity index 68% rename from test/Polly.Core.Tests/Utils/ReloadableResilienceStrategyTests.cs rename to test/Polly.Core.Tests/Utils/ReloadableResiliencePipelineTests.cs index ff735890cd3..8baacab9610 100644 --- a/test/Polly.Core.Tests/Utils/ReloadableResilienceStrategyTests.cs +++ b/test/Polly.Core.Tests/Utils/ReloadableResiliencePipelineTests.cs @@ -3,13 +3,13 @@ namespace Polly.Core.Tests.Utils; -public class ReloadableResilienceStrategyTests : IDisposable +public class ReloadableResiliencePipelineTests : IDisposable { private readonly List _events = new(); private readonly ResilienceStrategyTelemetry _telemetry; private CancellationTokenSource _cancellationTokenSource; - public ReloadableResilienceStrategyTests() + public ReloadableResiliencePipelineTests() { _telemetry = TestUtilities.CreateResilienceTelemetry(args => { @@ -24,18 +24,18 @@ public ReloadableResilienceStrategyTests() [Fact] public void Ctor_Ok() { - var strategy = new TestResilienceStrategy().AsStrategy(); + var strategy = new TestResilienceStrategy().AsPipeline(); var sut = CreateSut(strategy); - sut.Strategy.Should().Be(strategy); + sut.Pipeline.Should().Be(strategy); - ReloadableResilienceStrategy.ReloadFailedEvent.Should().Be("ReloadFailed"); + ReloadableResiliencePipeline.ReloadFailedEvent.Should().Be("ReloadFailed"); } [Fact] public void ChangeTriggered_StrategyReloaded() { - var strategy = new TestResilienceStrategy().AsStrategy(); + var strategy = new TestResilienceStrategy().AsPipeline(); var sut = CreateSut(strategy); for (var i = 0; i < 10; i++) @@ -44,7 +44,7 @@ public void ChangeTriggered_StrategyReloaded() _cancellationTokenSource = new CancellationTokenSource(); src.Cancel(); - sut.Strategy.Should().NotBe(strategy); + sut.Pipeline.Should().NotBe(strategy); } _events.Where(e => e.Event.EventName == "ReloadFailed").Should().HaveCount(0); @@ -54,34 +54,34 @@ public void ChangeTriggered_StrategyReloaded() [Fact] public void ChangeTriggered_FactoryError_LastStrategyUsedAndErrorReported() { - var strategy = new TestResilienceStrategy().AsStrategy(); + var strategy = new TestResilienceStrategy().AsPipeline(); var sut = CreateSut(strategy, () => throw new InvalidOperationException()); _cancellationTokenSource.Cancel(); - sut.Strategy.Should().Be(strategy); + sut.Pipeline.Should().Be(strategy); _events.Should().HaveCount(2); _events[0] .Arguments .Should() - .BeOfType(); + .BeOfType(); var args = _events[1] .Arguments .Should() - .BeOfType() + .BeOfType() .Subject; args.Exception.Should().BeOfType(); } - private ReloadableResilienceStrategy CreateSut(ResilienceStrategy? initial = null, Func? factory = null) + private ReloadableResiliencePipeline CreateSut(ResiliencePipeline? initial = null, Func? factory = null) { - factory ??= () => new TestResilienceStrategy().AsStrategy(); + factory ??= () => new TestResilienceStrategy().AsPipeline(); return new( - initial ?? new TestResilienceStrategy().AsStrategy(), + initial ?? new TestResilienceStrategy().AsPipeline(), () => _cancellationTokenSource.Token, factory, _telemetry); diff --git a/test/Polly.Core.Tests/Utils/ReactiveResilienceStrategyBridgeTests.cs b/test/Polly.Core.Tests/Utils/ResiliencePipelineBridgeTests.cs similarity index 80% rename from test/Polly.Core.Tests/Utils/ReactiveResilienceStrategyBridgeTests.cs rename to test/Polly.Core.Tests/Utils/ResiliencePipelineBridgeTests.cs index 5a6a34c2e32..ce26c409201 100644 --- a/test/Polly.Core.Tests/Utils/ReactiveResilienceStrategyBridgeTests.cs +++ b/test/Polly.Core.Tests/Utils/ResiliencePipelineBridgeTests.cs @@ -2,7 +2,7 @@ namespace Polly.Core.Tests.Utils; -public class ReactiveResilienceStrategyBridgeTests +public class ResiliencePipelineBridgeTests { [Fact] public void Ctor_Ok() @@ -15,7 +15,7 @@ public void Execute_NonGeneric_Ok() { var values = new List(); - var strategy = new ReactiveResilienceStrategyBridge(new Strategy(outcome => + var strategy = new ResiliencePipelineBridge(new Strategy(outcome => { values.Add(outcome.Result); })); @@ -36,7 +36,7 @@ public void Execute_Generic_Ok() { var values = new List(); - var strategy = new ReactiveResilienceStrategyBridge(new Strategy(outcome => + var strategy = new ResiliencePipelineBridge(new Strategy(outcome => { values.Add(outcome.Result); })); @@ -51,7 +51,7 @@ public void Execute_Generic_Ok() public void Pipeline_TypeCheck_Ok() { var called = false; - var strategy = new ReactiveResilienceStrategyBridge(new Strategy(o => + var strategy = new ResiliencePipelineBridge(new Strategy(o => { o.Result.Should().Be(-1); called = true; @@ -62,7 +62,7 @@ public void Pipeline_TypeCheck_Ok() called.Should().BeTrue(); } - private class Strategy : ReactiveResilienceStrategy + private class Strategy : ResilienceStrategy { private readonly Action> _onOutcome; diff --git a/test/Polly.Extensions.Tests/DependencyInjection/PollyServiceCollectionExtensionTests.cs b/test/Polly.Extensions.Tests/DependencyInjection/PollyServiceCollectionExtensionTests.cs index 88d082229e5..8d769164335 100644 --- a/test/Polly.Extensions.Tests/DependencyInjection/PollyServiceCollectionExtensionTests.cs +++ b/test/Polly.Extensions.Tests/DependencyInjection/PollyServiceCollectionExtensionTests.cs @@ -10,92 +10,92 @@ namespace Polly.Extensions.Tests.DependencyInjection; public class PollyServiceCollectionExtensionTests { - private const string Key = "my-strategy"; + private const string Key = "my-pipeline"; private ServiceCollection _services; public PollyServiceCollectionExtensionTests() => _services = new ServiceCollection(); [Fact] - public void AddResilienceStrategy_ArgValidation() + public void AddResiliencePipeline_ArgValidation() { _services = null!; - Assert.Throws(() => AddResilienceStrategy(Key)); - Assert.Throws(() => AddResilienceStrategy(Key)); + Assert.Throws(() => AddResiliencePipeline(Key)); + Assert.Throws(() => AddResiliencePipeline(Key)); _services = new ServiceCollection(); - Assert.Throws(() => _services.AddResilienceStrategy( + Assert.Throws(() => _services.AddResiliencePipeline( Key, - (Action>)null!)); - Assert.Throws(() => _services.AddResilienceStrategy( + (Action>)null!)); + Assert.Throws(() => _services.AddResiliencePipeline( Key, - (Action, AddResilienceStrategyContext>)null!)); + (Action, AddResiliencePipelineContext>)null!)); - Assert.Throws(() => _services.AddResilienceStrategy( + Assert.Throws(() => _services.AddResiliencePipeline( Key, - (Action)null!)); + (Action)null!)); - Assert.Throws(() => _services.AddResilienceStrategy( + Assert.Throws(() => _services.AddResiliencePipeline( Key, - (Action>)null!)); + (Action>)null!)); } [InlineData(true)] [InlineData(false)] [Theory] - public void AddResilienceStrategy_EnsureRegisteredServices(bool generic) + public void AddResiliencePipeline_EnsureRegisteredServices(bool generic) { if (generic) { - AddResilienceStrategy(Key); + AddResiliencePipeline(Key); } else { - AddResilienceStrategy(Key); + AddResiliencePipeline(Key); } var serviceProvider = _services.BuildServiceProvider(); - serviceProvider.GetServices().Should().NotBeNull(); - serviceProvider.GetServices>().Should().NotBeNull(); - serviceProvider.GetServices>().Should().NotBeNull(); - serviceProvider.GetServices().Should().NotBeSameAs(serviceProvider.GetServices()); + serviceProvider.GetServices().Should().NotBeNull(); + serviceProvider.GetServices>().Should().NotBeNull(); + serviceProvider.GetServices>().Should().NotBeNull(); + serviceProvider.GetServices().Should().NotBeSameAs(serviceProvider.GetServices()); } [Fact] - public void AddResilienceStrategy_MultipleRegistries_Ok() + public void AddResiliencePipeline_MultipleRegistries_Ok() { - AddResilienceStrategy(Key); - AddResilienceStrategy(Key); - AddResilienceStrategy(Key); + AddResiliencePipeline(Key); + AddResiliencePipeline(Key); + AddResiliencePipeline(Key); - _services.AddResilienceStrategy(10, context => context.AddStrategy(new TestStrategy())); - _services.AddResilienceStrategy(10, context => context.AddStrategy(new TestStrategy())); - _services.AddResilienceStrategy(10, context => context.AddStrategy(new TestStrategy())); + _services.AddResiliencePipeline(10, context => context.AddStrategy(new TestStrategy())); + _services.AddResiliencePipeline(10, context => context.AddStrategy(new TestStrategy())); + _services.AddResiliencePipeline(10, context => context.AddStrategy(new TestStrategy())); var serviceProvider = _services.BuildServiceProvider(); - serviceProvider.GetRequiredService>().GetStrategy(Key).Should().NotBeNull(); - serviceProvider.GetRequiredService>().GetStrategy(Key).Should().NotBeNull(); - serviceProvider.GetRequiredService>().GetStrategy(Key).Should().NotBeNull(); + serviceProvider.GetRequiredService>().GetPipeline(Key).Should().NotBeNull(); + serviceProvider.GetRequiredService>().GetPipeline(Key).Should().NotBeNull(); + serviceProvider.GetRequiredService>().GetPipeline(Key).Should().NotBeNull(); - serviceProvider.GetRequiredService>().GetStrategy(10).Should().NotBeNull(); - serviceProvider.GetRequiredService>().GetStrategy(10).Should().NotBeNull(); - serviceProvider.GetRequiredService>().GetStrategy(10).Should().NotBeNull(); + serviceProvider.GetRequiredService>().GetPipeline(10).Should().NotBeNull(); + serviceProvider.GetRequiredService>().GetPipeline(10).Should().NotBeNull(); + serviceProvider.GetRequiredService>().GetPipeline(10).Should().NotBeNull(); } [InlineData(true)] [InlineData(false)] [Theory] - public void AddResilienceStrategy_EnsureContextFilled(bool generic) + public void AddResiliencePipeline_EnsureContextFilled(bool generic) { var asserted = false; if (generic) { - _services.AddResilienceStrategy(Key, (builder, context) => + _services.AddResiliencePipeline(Key, (builder, context) => { context.RegistryContext.Should().NotBeNull(); - context.StrategyKey.Should().Be(Key); + context.PipelineKey.Should().Be(Key); context.BuilderName.Should().Be(Key); builder.Should().NotBeNull(); context.ServiceProvider.Should().NotBeNull(); @@ -103,20 +103,20 @@ public void AddResilienceStrategy_EnsureContextFilled(bool generic) asserted = true; }); - CreateProvider().GetStrategy(Key); + CreateProvider().GetPipeline(Key); } else { - _services.AddResilienceStrategy(Key, (builder, context) => + _services.AddResiliencePipeline(Key, (builder, context) => { - context.StrategyKey.Should().Be(Key); + context.PipelineKey.Should().Be(Key); builder.Should().NotBeNull(); context.ServiceProvider.Should().NotBeNull(); builder.AddStrategy(new TestStrategy()); asserted = true; }); - CreateProvider().GetStrategy(Key); + CreateProvider().GetPipeline(Key); } asserted.Should().BeTrue(); @@ -125,7 +125,7 @@ public void AddResilienceStrategy_EnsureContextFilled(bool generic) [InlineData(true)] [InlineData(false)] [Theory] - public void AddResilienceStrategy_EnsureTelemetryEnabled(bool hasLogging) + public void AddResiliencePipeline_EnsureTelemetryEnabled(bool hasLogging) { ResilienceStrategyTelemetry? telemetry = null; @@ -134,7 +134,7 @@ public void AddResilienceStrategy_EnsureTelemetryEnabled(bool hasLogging) _services.AddLogging(); } - _services.AddResilienceStrategy(Key, builder => + _services.AddResiliencePipeline(Key, builder => builder.AddStrategy(context => { telemetry = context.Telemetry; @@ -142,7 +142,7 @@ public void AddResilienceStrategy_EnsureTelemetryEnabled(bool hasLogging) }, new TestResilienceStrategyOptions())); - CreateProvider().GetStrategy(Key); + CreateProvider().GetPipeline(Key); var diagSource = telemetry!.GetType().GetProperty("DiagnosticSource", BindingFlags.Instance | BindingFlags.NonPublic)!.GetValue(telemetry); diagSource.Should().BeOfType(); @@ -160,63 +160,63 @@ public void AddResilienceStrategy_EnsureTelemetryEnabled(bool hasLogging) } [Fact] - public void AddResilienceStrategy_EnsureCompositeStrategyBuilderResolvedCorrectly() + public void AddResiliencePipeline_EnsureResiliencePipelineBuilderResolvedCorrectly() { var asserted = false; var key = new ResiliencePropertyKey("A"); - AddResilienceStrategy(Key, context => + AddResiliencePipeline(Key, context => { context.BuilderProperties.TryGetValue(PollyDependencyInjectionKeys.ServiceProvider, out _).Should().BeTrue(); asserted = true; }); - CreateProvider().GetStrategy(Key); + CreateProvider().GetPipeline(Key); asserted.Should().BeTrue(); } [Fact] - public void AddResilienceStrategy_EnsureServicesNotAddedTwice() + public void AddResiliencePipeline_EnsureServicesNotAddedTwice() { - AddResilienceStrategy(Key); + AddResiliencePipeline(Key); var count = _services.Count; - AddResilienceStrategy(Key); + AddResiliencePipeline(Key); _services.Count.Should().Be(count + 1); } [Fact] - public void AddResilienceStrategy_Single_Ok() + public void AddResiliencePipeline_Single_Ok() { - AddResilienceStrategy(Key); + AddResiliencePipeline(Key); var provider = CreateProvider(); - var strategy = provider.GetStrategy(Key); - provider.GetStrategy("my-strategy").Should().BeSameAs(provider.GetStrategy("my-strategy")); + var pipeline = provider.GetPipeline(Key); + provider.GetPipeline("my-pipeline").Should().BeSameAs(provider.GetPipeline("my-pipeline")); } [InlineData(true)] [InlineData(false)] [Theory] - public void AddResilienceStrategy_Twice_LastOneWins(bool generic) + public void AddResiliencePipeline_Twice_LastOneWins(bool generic) { var firstCalled = false; var secondCalled = false; if (generic) { - AddResilienceStrategy(Key, _ => firstCalled = true); - AddResilienceStrategy(Key, _ => secondCalled = true); - CreateProvider().GetStrategy(Key); + AddResiliencePipeline(Key, _ => firstCalled = true); + AddResiliencePipeline(Key, _ => secondCalled = true); + CreateProvider().GetPipeline(Key); } else { - AddResilienceStrategy(Key, _ => firstCalled = true); - AddResilienceStrategy(Key, _ => secondCalled = true); - CreateProvider().GetStrategy(Key); + AddResiliencePipeline(Key, _ => firstCalled = true); + AddResiliencePipeline(Key, _ => secondCalled = true); + CreateProvider().GetPipeline(Key); } firstCalled.Should().BeFalse(); @@ -224,13 +224,13 @@ public void AddResilienceStrategy_Twice_LastOneWins(bool generic) } [Fact] - public void AddResilienceStrategy_Multiple_Ok() + public void AddResiliencePipeline_Multiple_Ok() { for (var i = 0; i < 10; i++) { - AddResilienceStrategy(i.ToString(CultureInfo.InvariantCulture)); - AddResilienceStrategy(i.ToString(CultureInfo.InvariantCulture)); - AddResilienceStrategy(i.ToString(CultureInfo.InvariantCulture)); + AddResiliencePipeline(i.ToString(CultureInfo.InvariantCulture)); + AddResiliencePipeline(i.ToString(CultureInfo.InvariantCulture)); + AddResiliencePipeline(i.ToString(CultureInfo.InvariantCulture)); } var provider = CreateProvider(); @@ -243,9 +243,9 @@ public void AddResilienceStrategy_Multiple_Ok() return new object[] { - provider.GetStrategy(name), - provider.GetStrategy(name), - provider.GetStrategy(name) + provider.GetPipeline(name), + provider.GetPipeline(name), + provider.GetPipeline(name) }; }) .Distinct() @@ -254,30 +254,30 @@ public void AddResilienceStrategy_Multiple_Ok() } [Fact] - public void AddResilienceStrategyRegistry_Ok() + public void AddResiliencePipelineRegistry_Ok() { - var provider = new ServiceCollection().AddResilienceStrategyRegistry().BuildServiceProvider(); + var provider = new ServiceCollection().AddResiliencePipelineRegistry().BuildServiceProvider(); - provider.GetRequiredService>().Should().NotBeNull(); - provider.GetRequiredService>().Should().NotBeNull(); - provider.GetRequiredService().DiagnosticSource.Should().NotBeNull(); + provider.GetRequiredService>().Should().NotBeNull(); + provider.GetRequiredService>().Should().NotBeNull(); + provider.GetRequiredService().DiagnosticSource.Should().NotBeNull(); } [Fact] - public void AddResilienceStrategyRegistry_ConfigureCallback_Ok() + public void AddResiliencePipelineRegistry_ConfigureCallback_Ok() { Func formatter = s => s; - var provider = new ServiceCollection().AddResilienceStrategyRegistry(options => options.InstanceNameFormatter = formatter).BuildServiceProvider(); + var provider = new ServiceCollection().AddResiliencePipelineRegistry(options => options.InstanceNameFormatter = formatter).BuildServiceProvider(); - provider.GetRequiredService>().Should().NotBeNull(); - provider.GetRequiredService>().Should().NotBeNull(); - provider.GetRequiredService>>().Value.InstanceNameFormatter.Should().Be(formatter); + provider.GetRequiredService>().Should().NotBeNull(); + provider.GetRequiredService>().Should().NotBeNull(); + provider.GetRequiredService>>().Value.InstanceNameFormatter.Should().Be(formatter); } - private void AddResilienceStrategy(string key, Action? onBuilding = null) + private void AddResiliencePipeline(string key, Action? onBuilding = null) { - _services.AddResilienceStrategy(key, builder => + _services.AddResiliencePipeline(key, builder => { builder.AddStrategy(context => { @@ -287,9 +287,9 @@ private void AddResilienceStrategy(string key, Action? o }); } - private void AddResilienceStrategy(string key, Action? onBuilding = null) + private void AddResiliencePipeline(string key, Action? onBuilding = null) { - _services.AddResilienceStrategy(key, builder => + _services.AddResiliencePipeline(key, builder => { builder.AddStrategy(context => { @@ -299,12 +299,12 @@ private void AddResilienceStrategy(string key, Action CreateProvider() + private ResiliencePipelineProvider CreateProvider() { - return _services.BuildServiceProvider().GetRequiredService>(); + return _services.BuildServiceProvider().GetRequiredService>(); } - private class TestStrategy : NonReactiveResilienceStrategy + private class TestStrategy : ResilienceStrategy { protected override ValueTask> ExecuteCore( Func>> callback, diff --git a/test/Polly.Extensions.Tests/Issues/IssuesTests.OnCircuitBreakWithServiceProvider_796.cs b/test/Polly.Extensions.Tests/Issues/IssuesTests.OnCircuitBreakWithServiceProvider_796.cs index 292002536dd..3a56c1b06f3 100644 --- a/test/Polly.Extensions.Tests/Issues/IssuesTests.OnCircuitBreakWithServiceProvider_796.cs +++ b/test/Polly.Extensions.Tests/Issues/IssuesTests.OnCircuitBreakWithServiceProvider_796.cs @@ -12,8 +12,8 @@ public async Task OnCircuitBreakWithServiceProvider_796() { var contextChecked = false; - // create the strategy - var serviceCollection = new ServiceCollection().AddResilienceStrategy("my-strategy", (builder, context) => + // create the pipeline + var serviceCollection = new ServiceCollection().AddResiliencePipeline("my-pipeline", (builder, context) => { builder .AddStrategy(new ServiceProviderStrategy(context.ServiceProvider)) @@ -38,23 +38,23 @@ public async Task OnCircuitBreakWithServiceProvider_796() }); // retrieve the provider - var strategyProvider = serviceCollection.BuildServiceProvider().GetRequiredService>(); - var strategy = strategyProvider.GetStrategy("my-strategy"); + var pipelineProvider = serviceCollection.BuildServiceProvider().GetRequiredService>(); + var pipeline = pipelineProvider.GetPipeline("my-pipeline"); // now trigger the circuit breaker by evaluating multiple result types for (int i = 0; i < 10; i++) { - await strategy.ExecuteAsync(_ => new ValueTask("error")); + await pipeline.ExecuteAsync(_ => new ValueTask("error")); } // now the circuit breaker should be open - await strategy.Invoking(s => s.ExecuteAsync(_ => new ValueTask("valid-result")).AsTask()).Should().ThrowAsync(); + await pipeline.Invoking(s => s.ExecuteAsync(_ => new ValueTask("valid-result")).AsTask()).Should().ThrowAsync(); // check that service provider was received in the context contextChecked.Should().BeTrue(); } - private class ServiceProviderStrategy : NonReactiveResilienceStrategy + private class ServiceProviderStrategy : ResilienceStrategy { private readonly IServiceProvider _serviceProvider; diff --git a/test/Polly.Extensions.Tests/Issues/IssuesTests.OverrideLibraryStrategies_1072.cs b/test/Polly.Extensions.Tests/Issues/IssuesTests.OverrideLibraryStrategies_1072.cs index 7e12e803e81..01ddaddf36f 100644 --- a/test/Polly.Extensions.Tests/Issues/IssuesTests.OverrideLibraryStrategies_1072.cs +++ b/test/Polly.Extensions.Tests/Issues/IssuesTests.OverrideLibraryStrategies_1072.cs @@ -19,8 +19,8 @@ public void OverrideLibraryStrategies_898(bool overrideStrategy) if (overrideStrategy) { - // This call overrides the strategy that the library uses. The last call to AddResilienceStrategy wins. - services.AddResilienceStrategy("library-strategy", builder => builder.AddRetry(new() + // This call overrides the pipeline that the library uses. The last call to AddResiliencePipeline wins. + services.AddResiliencePipeline("library-pipeline", builder => builder.AddRetry(new() { ShouldHandle = args => args.Exception switch { @@ -44,7 +44,7 @@ public void OverrideLibraryStrategies_898(bool overrideStrategy) } else { - // Originally, the library strategy only handled InvalidOperationException. + // Originally, the library pipeline only handled InvalidOperationException. api.Invoking(a => a.ExecuteLibrary(UnstableCall)).Should().Throw(); } @@ -54,7 +54,7 @@ void UnstableCall() { failFirstCall = false; - // This exception was not originally handled by strategy. + // This exception was not originally handled by pipeline. throw new SocketException(); } } @@ -63,7 +63,7 @@ void UnstableCall() private static void AddLibraryServices(IServiceCollection services) { services.TryAddSingleton(); - services.AddResilienceStrategy("library-strategy", builder => builder.AddRetry(new() + services.AddResiliencePipeline("library-pipeline", builder => builder.AddRetry(new() { ShouldHandle = args => args.Exception switch { @@ -75,10 +75,10 @@ private static void AddLibraryServices(IServiceCollection services) public class LibraryApi { - private readonly ResilienceStrategy _strategy; + private readonly ResiliencePipeline _pipeline; - public LibraryApi(ResilienceStrategyProvider provider) => _strategy = provider.GetStrategy("library-strategy"); + public LibraryApi(ResiliencePipelineProvider provider) => _pipeline = provider.GetPipeline("library-pipeline"); - public void ExecuteLibrary(Action execute) => _strategy.Execute(execute); + public void ExecuteLibrary(Action execute) => _pipeline.Execute(execute); } } diff --git a/test/Polly.Extensions.Tests/Issues/IssuesTests.PartitionedRateLimiter_1365.cs b/test/Polly.Extensions.Tests/Issues/IssuesTests.PartitionedRateLimiter_1365.cs index 011ed14a313..84248d4629f 100644 --- a/test/Polly.Extensions.Tests/Issues/IssuesTests.PartitionedRateLimiter_1365.cs +++ b/test/Polly.Extensions.Tests/Issues/IssuesTests.PartitionedRateLimiter_1365.cs @@ -18,7 +18,7 @@ public async void PartitionedRateLimiter_EnsureUserLimited_1365() var userKey = new ResiliencePropertyKey("user"); var services = new ServiceCollection(); services - .AddResilienceStrategy("shared-limiter", (builder, context) => + .AddResiliencePipeline("shared-limiter", (builder, context) => { var partitionedLimiter = PartitionedRateLimiter.Create(context => { @@ -41,7 +41,7 @@ public async void PartitionedRateLimiter_EnsureUserLimited_1365() }); var serviceProvider = services.BuildServiceProvider(); - var strategy = serviceProvider.GetRequiredService>().GetStrategy("shared-limiter"); + var pipeline = serviceProvider.GetRequiredService>().GetPipeline("shared-limiter"); // assert user is limited using var asserted = new ManualResetEvent(false); @@ -64,7 +64,7 @@ async Task ExecuteBatch(string user, ManualResetEvent waitAsserted) var context = ResilienceContextPool.Shared.Get(); context.Properties.Set(userKey, user); - await strategy.ExecuteAsync(async _ => + await pipeline.ExecuteAsync(async _ => { await Task.Yield(); waitAsserted.WaitOne(); diff --git a/test/Polly.Extensions.Tests/Issues/IssuesTests.StrategiesPerEndpoint_1365.cs b/test/Polly.Extensions.Tests/Issues/IssuesTests.StrategiesPerEndpoint_1365.cs index c40961b0c6d..277be49c35d 100644 --- a/test/Polly.Extensions.Tests/Issues/IssuesTests.StrategiesPerEndpoint_1365.cs +++ b/test/Polly.Extensions.Tests/Issues/IssuesTests.StrategiesPerEndpoint_1365.cs @@ -18,22 +18,22 @@ public void StrategiesPerEndpoint_1365() using var listener = TestUtilities.EnablePollyMetering(events); var services = new ServiceCollection(); - services.AddResilienceStrategyRegistry(); + services.AddResiliencePipelineRegistry(); services.AddOptions(); - // add resilience strategy, keyed by EndpointKey that only defines the builder name - services.AddResilienceStrategy(new EndpointKey("endpoint-pipeline", string.Empty, string.Empty), (builder, context) => + // add resilience pipeline, keyed by EndpointKey that only defines the builder name + services.AddResiliencePipeline(new EndpointKey("endpoint-pipeline", string.Empty, string.Empty), (builder, context) => { var serviceProvider = context.ServiceProvider; - var endpointOptions = context.GetOptions().Endpoints[context.StrategyKey.EndpointName]; - var registry = context.ServiceProvider.GetRequiredService>(); + var endpointOptions = context.GetOptions().Endpoints[context.PipelineKey.EndpointName]; + var registry = context.ServiceProvider.GetRequiredService>(); // we want this pipeline to react to changes to the options context.EnableReloads(); // we want to limit the number of concurrent requests per endpoint and not include the resource. - // using a registry we can create and cache the shared resilience strategy - var rateLimiterStrategy = registry.GetOrAddStrategy($"rate-limiter/{context.StrategyKey.EndpointName}", (builder, context) => + // using a registry we can create and cache the shared resilience pipeline + var rateLimiterStrategy = registry.GetOrAddPipeline($"rate-limiter/{context.PipelineKey.EndpointName}", (builder, context) => { // let's also enable reloads for the rate limiter context.EnableReloads(serviceProvider.GetRequiredService>()); @@ -41,7 +41,7 @@ public void StrategiesPerEndpoint_1365() builder.AddConcurrencyLimiter(new ConcurrencyLimiterOptions { PermitLimit = endpointOptions.MaxParallelization }); }); - builder.AddStrategy(rateLimiterStrategy); + builder.AddPipeline(rateLimiterStrategy); // apply retries optionally per-endpoint if (endpointOptions.Retries > 0) @@ -51,7 +51,7 @@ public void StrategiesPerEndpoint_1365() BackoffType = RetryBackoffType.Exponential, UseJitter = true, RetryCount = endpointOptions.Retries, - Name = $"{context.StrategyKey.EndpointName}-Retry", + Name = $"{context.PipelineKey.EndpointName}-Retry", }); } @@ -59,22 +59,22 @@ public void StrategiesPerEndpoint_1365() builder.AddCircuitBreaker(new() { BreakDuration = endpointOptions.BreakDuration, - Name = $"{context.StrategyKey.EndpointName}-{context.StrategyKey.Resource}-CircuitBreaker" + Name = $"{context.PipelineKey.EndpointName}-{context.PipelineKey.Resource}-CircuitBreaker" }); // apply timeout builder.AddTimeout(new TimeoutStrategyOptions { - Name = $"{context.StrategyKey.EndpointName}-Timeout", + Name = $"{context.PipelineKey.EndpointName}-Timeout", Timeout = endpointOptions.Timeout.Add(TimeSpan.FromSeconds(1)), }); }); // configure the registry to allow multi-dimensional keys - services.AddResilienceStrategyRegistry(options => + services.AddResiliencePipelineRegistry(options => { options.BuilderComparer = new EndpointKey.BuilderComparer(); - options.StrategyComparer = new EndpointKey.StrategyComparer(); + options.PipelineComparer = new EndpointKey.StrategyComparer(); // format the key for telemetry options.InstanceNameFormatter = key => $"{key.EndpointName}/{key.Resource}"; @@ -83,24 +83,24 @@ public void StrategiesPerEndpoint_1365() options.BuilderNameFormatter = key => key.BuilderName; }); - // create the strategy provider - var provider = services.BuildServiceProvider().GetRequiredService>(); + // create the pipeline provider + var provider = services.BuildServiceProvider().GetRequiredService>(); // define a key for each resource/endpoint combination var resource1Key = new EndpointKey("endpoint-pipeline", "Endpoint 1", "Resource 1"); var resource2Key = new EndpointKey("endpoint-pipeline", "Endpoint 1", "Resource 2"); - var strategy1 = provider.GetStrategy(resource1Key); - var strategy2 = provider.GetStrategy(resource2Key); + var pipeline1 = provider.GetPipeline(resource1Key); + var pipeline2 = provider.GetPipeline(resource2Key); - strategy1.Should().NotBe(strategy2); - provider.GetStrategy(resource1Key).Should().BeSameAs(strategy1); - provider.GetStrategy(resource2Key).Should().BeSameAs(strategy2); + pipeline1.Should().NotBe(pipeline2); + provider.GetPipeline(resource1Key).Should().BeSameAs(pipeline1); + provider.GetPipeline(resource2Key).Should().BeSameAs(pipeline2); - strategy1.Execute(() => { }); + pipeline1.Execute(() => { }); events.Should().HaveCount(5); - events[0].Tags["builder-name"].Should().Be("endpoint-pipeline"); - events[0].Tags["builder-instance"].Should().Be("Endpoint 1/Resource 1"); + events[0].Tags["pipeline-name"].Should().Be("endpoint-pipeline"); + events[0].Tags["pipeline-instance"].Should().Be("Endpoint 1/Resource 1"); } public class EndpointOptions diff --git a/test/Polly.Extensions.Tests/ReloadableResilienceStrategyTests.cs b/test/Polly.Extensions.Tests/ReloadableResiliencePipelineTests.cs similarity index 84% rename from test/Polly.Extensions.Tests/ReloadableResilienceStrategyTests.cs rename to test/Polly.Extensions.Tests/ReloadableResiliencePipelineTests.cs index ad7a7179648..662b41fb2f1 100644 --- a/test/Polly.Extensions.Tests/ReloadableResilienceStrategyTests.cs +++ b/test/Polly.Extensions.Tests/ReloadableResiliencePipelineTests.cs @@ -5,7 +5,7 @@ namespace Polly.Extensions.Tests; -public class ReloadableResilienceStrategyTests +public class ReloadableResiliencePipelineTests { private static readonly ResiliencePropertyKey TagKey = new("tests.tag"); @@ -13,7 +13,7 @@ public class ReloadableResilienceStrategyTests [InlineData("custom-name")] [InlineData("")] [Theory] - public void AddResilienceStrategy_EnsureReloadable(string? name) + public void AddResiliencePipeline_EnsureReloadable(string? name) { var reloadableConfig = new ReloadableConfiguration(); reloadableConfig.Reload(new() { { "tag", "initial-tag" } }); @@ -30,7 +30,7 @@ public void AddResilienceStrategy_EnsureReloadable(string? name) services.Configure(name, builder.Build()); } - services.AddResilienceStrategy("my-strategy", (builder, context) => + services.AddResiliencePipeline("my-pipeline", (builder, context) => { var options = context.GetOptions(name); context.EnableReloads(name); @@ -39,23 +39,23 @@ public void AddResilienceStrategy_EnsureReloadable(string? name) }); var serviceProvider = services.BuildServiceProvider(); - var strategy = serviceProvider.GetRequiredService>().GetStrategy("my-strategy"); + var pipeline = serviceProvider.GetRequiredService>().GetPipeline("my-pipeline"); var context = ResilienceContextPool.Shared.Get(); // initial - strategy.Execute(_ => "dummy", context); + pipeline.Execute(_ => "dummy", context); context.Properties.GetValue(TagKey, string.Empty).Should().Be("initial-tag"); // reloads for (int i = 0; i < 10; i++) { reloadableConfig.Reload(new() { { "tag", $"reload-{i}" } }); - strategy.Execute(_ => "dummy", context); + pipeline.Execute(_ => "dummy", context); context.Properties.GetValue(TagKey, string.Empty).Should().Be($"reload-{i}"); } } - public class ReloadableStrategy : NonReactiveResilienceStrategy + public class ReloadableStrategy : ResilienceStrategy { public ReloadableStrategy(string tag) => Tag = tag; diff --git a/test/Polly.Extensions.Tests/Telemetry/ResilienceTelemetryDiagnosticSourceTests.cs b/test/Polly.Extensions.Tests/Telemetry/ResilienceTelemetryDiagnosticSourceTests.cs index 8b96cb873c2..072c4eeb9a5 100644 --- a/test/Polly.Extensions.Tests/Telemetry/ResilienceTelemetryDiagnosticSourceTests.cs +++ b/test/Polly.Extensions.Tests/Telemetry/ResilienceTelemetryDiagnosticSourceTests.cs @@ -74,11 +74,11 @@ public void WriteEvent_LoggingWithOutcome_Ok(bool noOutcome) if (noOutcome) { - messages[0].Message.Should().Be("Resilience event occurred. EventName: 'my-event', Source: 'my-builder/builder-instance/my-strategy', Operation Key: 'op-key', Result: ''"); + messages[0].Message.Should().Be("Resilience event occurred. EventName: 'my-event', Source: 'my-pipeline/pipeline-instance/my-strategy', Operation Key: 'op-key', Result: ''"); } else { - messages[0].Message.Should().Be("Resilience event occurred. EventName: 'my-event', Source: 'my-builder/builder-instance/my-strategy', Operation Key: 'op-key', Result: '200'"); + messages[0].Message.Should().Be("Resilience event occurred. EventName: 'my-event', Source: 'my-pipeline/pipeline-instance/my-strategy', Operation Key: 'op-key', Result: '200'"); } } @@ -101,11 +101,11 @@ public void WriteEvent_LoggingWithException_Ok(bool noOutcome) if (noOutcome) { - messages[0].Message.Should().Be("Resilience event occurred. EventName: 'my-event', Source: 'my-builder/builder-instance/my-strategy', Operation Key: 'op-key', Result: ''"); + messages[0].Message.Should().Be("Resilience event occurred. EventName: 'my-event', Source: 'my-pipeline/pipeline-instance/my-strategy', Operation Key: 'op-key', Result: ''"); } else { - messages[0].Message.Should().Be("Resilience event occurred. EventName: 'my-event', Source: 'my-builder/builder-instance/my-strategy', Operation Key: 'op-key', Result: 'Dummy message.'"); + messages[0].Message.Should().Be("Resilience event occurred. EventName: 'my-event', Source: 'my-pipeline/pipeline-instance/my-strategy', Operation Key: 'op-key', Result: 'Dummy message.'"); } } @@ -117,7 +117,7 @@ public void WriteEvent_LoggingWithoutInstanceName_Ok() var messages = _logger.GetRecords(new EventId(0, "ResilienceEvent")).ToList(); - messages[0].Message.Should().Be("Resilience event occurred. EventName: 'my-event', Source: 'my-builder/(null)/my-strategy', Operation Key: 'op-key', Result: ''"); + messages[0].Message.Should().Be("Resilience event occurred. EventName: 'my-event', Source: 'my-pipeline/(null)/my-strategy', Operation Key: 'op-key', Result: ''"); } [InlineData(ResilienceEventSeverity.Error, LogLevel.Error)] @@ -152,7 +152,7 @@ public void WriteExecutionAttempt_LoggingWithException_Ok() var messages = _logger.GetRecords(new EventId(3, "ExecutionAttempt")).ToList(); messages.Should().HaveCount(1); - messages[0].Message.Should().Be("Execution attempt. Source: 'my-builder/builder-instance/my-strategy', Operation Key: 'op-key', Result: 'Dummy message.', Handled: 'True', Attempt: '4', Execution Time: '123'"); + messages[0].Message.Should().Be("Execution attempt. Source: 'my-pipeline/pipeline-instance/my-strategy', Operation Key: 'op-key', Result: 'Dummy message.', Handled: 'True', Attempt: '4', Execution Time: '123'"); } [InlineData(true, true)] @@ -172,11 +172,11 @@ public void WriteExecutionAttempt_LoggingWithOutcome_Ok(bool noOutcome, bool han if (noOutcome) { string resultString = string.Empty; - messages[0].Message.Should().Be($"Execution attempt. Source: 'my-builder/builder-instance/my-strategy', Operation Key: 'op-key', Result: '{resultString}', Handled: '{handled}', Attempt: '4', Execution Time: '123'"); + messages[0].Message.Should().Be($"Execution attempt. Source: 'my-pipeline/pipeline-instance/my-strategy', Operation Key: 'op-key', Result: '{resultString}', Handled: '{handled}', Attempt: '4', Execution Time: '123'"); } else { - messages[0].Message.Should().Be($"Execution attempt. Source: 'my-builder/builder-instance/my-strategy', Operation Key: 'op-key', Result: '200', Handled: '{handled}', Attempt: '4', Execution Time: '123'"); + messages[0].Message.Should().Be($"Execution attempt. Source: 'my-pipeline/pipeline-instance/my-strategy', Operation Key: 'op-key', Result: '200', Handled: '{handled}', Attempt: '4', Execution Time: '123'"); } messages[0].LogLevel.Should().Be(LogLevel.Warning); @@ -225,10 +225,10 @@ public void WriteEvent_MeteringWithoutEnrichers_Ok(bool noOutcome, bool exceptio ev["event-name"].Should().Be("my-event"); ev["event-severity"].Should().Be("Warning"); - ev["strategy-name"].Should().Be("my-strategy"); - ev["builder-instance"].Should().Be("builder-instance"); + ev["pipeline-name"].Should().Be("my-pipeline"); + ev["pipeline-instance"].Should().Be("pipeline-instance"); ev["operation-key"].Should().Be("op-key"); - ev["builder-name"].Should().Be("my-builder"); + ev["strategy-name"].Should().Be("my-strategy"); ev["result-type"].Should().Be("Boolean"); if (outcome?.Exception is not null) @@ -273,10 +273,10 @@ public void WriteExecutionAttemptEvent_Metering_Ok(bool noOutcome, bool exceptio ev["event-name"].Should().Be("my-event"); ev["event-severity"].Should().Be("Warning"); - ev["strategy-name"].Should().Be("my-strategy"); - ev["builder-instance"].Should().Be("builder-instance"); + ev["pipeline-name"].Should().Be("my-pipeline"); + ev["pipeline-instance"].Should().Be("pipeline-instance"); ev["operation-key"].Should().Be("op-key"); - ev["builder-name"].Should().Be("my-builder"); + ev["pipeline-name"].Should().Be("my-pipeline"); ev["result-type"].Should().Be("Boolean"); ev["attempt-number"].Should().Be(5); ev["attempt-handled"].Should().Be(true); @@ -347,7 +347,7 @@ public void WriteEvent_MeteringWithoutBuilderInstance_Ok() { var telemetry = Create(); ReportEvent(telemetry, null, instanceName: null); - var events = GetEvents("resilience-events")[0].Should().NotContainKey("builder-instance"); + var events = GetEvents("resilience-events")[0].Should().NotContainKey("pipeline-instance"); } [InlineData(true)] @@ -391,10 +391,10 @@ public void PipelineExecution_Logged(bool healthy, bool exception) var messages = _logger.GetRecords(new EventId(1, "StrategyExecuting")).ToList(); messages.Should().HaveCount(1); - messages[0].Message.Should().Be("Resilience strategy executing. Source: 'my-builder/builder-instance', Operation Key: 'op-key', Result Type: 'Int32'"); + messages[0].Message.Should().Be("Resilience pipeline executing. Source: 'my-pipeline/pipeline-instance', Operation Key: 'op-key', Result Type: 'Int32'"); messages = _logger.GetRecords(new EventId(2, "StrategyExecuted")).ToList(); messages.Should().HaveCount(1); - messages[0].Message.Should().Match($"Resilience strategy executed. Source: 'my-builder/builder-instance', Operation Key: 'op-key', Result Type: 'Int32', Result: '{result}', Execution Health: '{healthString}', Execution Time: 10000ms"); + messages[0].Message.Should().Match($"Resilience pipeline executed. Source: 'my-pipeline/pipeline-instance', Operation Key: 'op-key', Result Type: 'Int32', Result: '{result}', Execution Health: '{healthString}', Execution Time: 10000ms"); messages[0].LogLevel.Should().Be(healthy ? LogLevel.Debug : LogLevel.Warning); } @@ -407,7 +407,7 @@ public void PipelineExecution_VoidResult_Ok() var messages = _logger.GetRecords(new EventId(1, "StrategyExecuting")).ToList(); messages.Should().HaveCount(1); - messages[0].Message.Should().Be("Resilience strategy executing. Source: 'my-builder/builder-instance', Operation Key: 'op-key', Result Type: 'void'"); + messages[0].Message.Should().Be("Resilience pipeline executing. Source: 'my-pipeline/pipeline-instance', Operation Key: 'op-key', Result Type: 'void'"); } [Fact] @@ -419,7 +419,7 @@ public void PipelineExecution_NoOutcome_Logged() ReportEvent(telemetry, outcome: null, arg: new PipelineExecutedArguments(TimeSpan.FromSeconds(10)), context: context); var messages = _logger.GetRecords(new EventId(2, "StrategyExecuted")).ToList(); - messages[0].Message.Should().Match($"Resilience strategy executed. Source: 'my-builder/builder-instance', Operation Key: 'op-key', Result Type: 'Int32', Result: '', Execution Health: 'Healthy', Execution Time: 10000ms"); + messages[0].Message.Should().Match($"Resilience pipeline executed. Source: 'my-pipeline/pipeline-instance', Operation Key: 'op-key', Result Type: 'Int32', Result: '', Execution Health: 'Healthy', Execution Time: 10000ms"); } [InlineData(true, false)] @@ -457,13 +457,13 @@ public void PipelineExecution_Metered(bool healthy, bool exception) var ev = _events.Single(v => v.Name == "pipeline-execution-duration").Tags; ev.Count.Should().Be(exception ? 10 : 9); - ev["builder-instance"].Should().Be("builder-instance"); + ev["pipeline-instance"].Should().Be("pipeline-instance"); ev["operation-key"].Should().Be("op-key"); - ev["builder-name"].Should().Be("my-builder"); + ev["pipeline-name"].Should().Be("my-pipeline"); ev["result-type"].Should().Be("Int32"); ev["event-name"].Should().Be("my-event"); ev["event-severity"].Should().Be("Warning"); - ev["strategy-name"].Should().Be("my-strategy"); + ev["pipeline-name"].Should().Be("my-pipeline"); ev["custom-tag"].Should().Be("custom-tag-value"); if (exception) @@ -517,7 +517,7 @@ private ResilienceTelemetryDiagnosticSource Create(Action? outcome, - string? instanceName = "builder-instance", + string? instanceName = "pipeline-instance", ResilienceContext? context = null, object? arg = null, ResilienceEventSeverity severity = ResilienceEventSeverity.Warning) @@ -531,7 +531,7 @@ private static void ReportEvent( telemetry.ReportEvent( new ResilienceEvent(severity, "my-event"), - "my-builder", + "my-pipeline", instanceName, props, "my-strategy", diff --git a/test/Polly.Extensions.Tests/Telemetry/TelemetryCompositeStrategyBuilderExtensionsTests.cs b/test/Polly.Extensions.Tests/Telemetry/TelemetryResiliencePipelineBuilderExtensionsTests.cs similarity index 91% rename from test/Polly.Extensions.Tests/Telemetry/TelemetryCompositeStrategyBuilderExtensionsTests.cs rename to test/Polly.Extensions.Tests/Telemetry/TelemetryResiliencePipelineBuilderExtensionsTests.cs index ae88b2ea581..2864affbf67 100644 --- a/test/Polly.Extensions.Tests/Telemetry/TelemetryCompositeStrategyBuilderExtensionsTests.cs +++ b/test/Polly.Extensions.Tests/Telemetry/TelemetryResiliencePipelineBuilderExtensionsTests.cs @@ -4,9 +4,9 @@ namespace Polly.Extensions.Tests.Telemetry; -public class TelemetryCompositeStrategyBuilderExtensionsTests +public class TelemetryResiliencePipelineBuilderExtensionsTests { - private readonly CompositeStrategyBuilder _builder = new(); + private readonly ResiliencePipelineBuilder _builder = new(); [Fact] public void ConfigureTelemetry_EnsureDiagnosticSourceUpdated() diff --git a/test/Polly.RateLimiting.Tests/RateLimiterCompositeStrategyBuilderExtensionsTests.cs b/test/Polly.RateLimiting.Tests/RateLimiterResiliencePipelineBuilderExtensionsTests.cs similarity index 76% rename from test/Polly.RateLimiting.Tests/RateLimiterCompositeStrategyBuilderExtensionsTests.cs rename to test/Polly.RateLimiting.Tests/RateLimiterResiliencePipelineBuilderExtensionsTests.cs index 7abb60271cf..2b067059719 100644 --- a/test/Polly.RateLimiting.Tests/RateLimiterCompositeStrategyBuilderExtensionsTests.cs +++ b/test/Polly.RateLimiting.Tests/RateLimiterResiliencePipelineBuilderExtensionsTests.cs @@ -5,9 +5,9 @@ namespace Polly.RateLimiting.Tests; -public class RateLimiterCompositeStrategyBuilderExtensionsTests +public class RateLimiterResiliencePipelineBuilderExtensionsTests { - public static readonly TheoryData> Data = new() + public static readonly TheoryData> Data = new() { builder => { @@ -35,9 +35,9 @@ public class RateLimiterCompositeStrategyBuilderExtensionsTests [MemberData(nameof(Data))] [Theory(Skip = "https://github.com/stryker-mutator/stryker-net/issues/2144")] - public void AddRateLimiter_Extensions_Ok(Action configure) + public void AddRateLimiter_Extensions_Ok(Action configure) { - var builder = new CompositeStrategyBuilder(); + var builder = new ResiliencePipelineBuilder(); configure(builder); @@ -49,7 +49,7 @@ public void AddConcurrencyLimiter_InvalidOptions_Throws() { Assert.Throws(() => { - return new CompositeStrategyBuilder().AddConcurrencyLimiter(new ConcurrencyLimiterOptions + return new ResiliencePipelineBuilder().AddConcurrencyLimiter(new ConcurrencyLimiterOptions { PermitLimit = -10, QueueLimit = -10 @@ -61,9 +61,9 @@ public void AddConcurrencyLimiter_InvalidOptions_Throws() [Fact] public void AddRateLimiter_AllExtensions_Ok() { - foreach (var configure in Data.Select(v => v[0]).Cast>()) + foreach (var configure in Data.Select(v => v[0]).Cast>()) { - var builder = new CompositeStrategyBuilder(); + var builder = new ResiliencePipelineBuilder(); configure(builder); @@ -80,13 +80,13 @@ public void AddRateLimiter_Ok() PermitLimit = 10 }); - new CompositeStrategyBuilder() + new ResiliencePipelineBuilder() .AddRateLimiter(new RateLimiterStrategyOptions { RateLimiter = ResilienceRateLimiter.Create(limiter) }) .Build() - .GetInnerStrategies() + .GetPipelineDescriptor() .FirstStrategy .StrategyInstance .Should() @@ -96,7 +96,7 @@ public void AddRateLimiter_Ok() [Fact] public void AddRateLimiter_InvalidOptions_Throws() { - new CompositeStrategyBuilder().Invoking(b => b.AddRateLimiter(new RateLimiterStrategyOptions { DefaultRateLimiterOptions = null! })) + new ResiliencePipelineBuilder().Invoking(b => b.AddRateLimiter(new RateLimiterStrategyOptions { DefaultRateLimiterOptions = null! })) .Should() .Throw() .WithMessage(""" @@ -110,7 +110,7 @@ The DefaultRateLimiterOptions field is required. [Fact] public void AddGenericRateLimiter_InvalidOptions_Throws() { - new CompositeStrategyBuilder().Invoking(b => b.AddRateLimiter(new RateLimiterStrategyOptions { DefaultRateLimiterOptions = null! })) + new ResiliencePipelineBuilder().Invoking(b => b.AddRateLimiter(new RateLimiterStrategyOptions { DefaultRateLimiterOptions = null! })) .Should() .Throw() .WithMessage(""" @@ -124,24 +124,24 @@ The DefaultRateLimiterOptions field is required. [Fact] public void AddRateLimiter_Options_Ok() { - var strategy = new CompositeStrategyBuilder() + var strategy = new ResiliencePipelineBuilder() .AddRateLimiter(new RateLimiterStrategyOptions { RateLimiter = ResilienceRateLimiter.Create(Substitute.For()) }) .Build() - .GetInnerStrategies() + .GetPipelineDescriptor() .FirstStrategy .StrategyInstance .Should() .BeOfType(); } - private static void AssertRateLimiterStrategy(CompositeStrategyBuilder builder, Action? assert = null, bool hasEvents = false) + private static void AssertRateLimiterStrategy(ResiliencePipelineBuilder builder, Action? assert = null, bool hasEvents = false) { - ResilienceStrategy strategy = builder.Build(); + ResiliencePipeline strategy = builder.Build(); - var limiterStrategy = (RateLimiterResilienceStrategy)strategy.GetInnerStrategies().FirstStrategy.StrategyInstance; + var limiterStrategy = (RateLimiterResilienceStrategy)strategy.GetPipelineDescriptor().FirstStrategy.StrategyInstance; assert?.Invoke(limiterStrategy); @@ -158,7 +158,7 @@ private static void AssertRateLimiterStrategy(CompositeStrategyBuilder builder, } strategy - .GetInnerStrategies() + .GetPipelineDescriptor() .FirstStrategy .StrategyInstance .Should() diff --git a/test/Polly.RateLimiting.Tests/RateLimiterResilienceStrategyTests.cs b/test/Polly.RateLimiting.Tests/RateLimiterResilienceStrategyTests.cs index c65e9351b51..df1e066d741 100644 --- a/test/Polly.RateLimiting.Tests/RateLimiterResilienceStrategyTests.cs +++ b/test/Polly.RateLimiting.Tests/RateLimiterResilienceStrategyTests.cs @@ -99,9 +99,9 @@ private void SetupLimiter(CancellationToken token) .Returns(result); } - private ResilienceStrategy Create() + private ResiliencePipeline Create() { - var builder = new CompositeStrategyBuilder + var builder = new ResiliencePipelineBuilder { DiagnosticSource = _diagnosticSource }; diff --git a/test/Polly.Specs/ResilienceStrategyConversionExtensionsTests.cs b/test/Polly.Specs/ResiliencePipelineConversionExtensionsTests.cs similarity index 89% rename from test/Polly.Specs/ResilienceStrategyConversionExtensionsTests.cs rename to test/Polly.Specs/ResiliencePipelineConversionExtensionsTests.cs index e153d914436..e1144c48e6f 100644 --- a/test/Polly.Specs/ResilienceStrategyConversionExtensionsTests.cs +++ b/test/Polly.Specs/ResiliencePipelineConversionExtensionsTests.cs @@ -2,7 +2,7 @@ namespace Polly.Specs; -public class ResilienceStrategyConversionExtensionsTests +public class ResiliencePipelineConversionExtensionsTests { private static readonly ResiliencePropertyKey Incoming = new("incoming-key"); @@ -11,12 +11,12 @@ public class ResilienceStrategyConversionExtensionsTests private static readonly ResiliencePropertyKey Outgoing = new("outgoing-key"); private readonly TestResilienceStrategy _strategy; - private readonly ResilienceStrategy _genericStrategy; + private readonly ResiliencePipeline _genericStrategy; private bool _isSynchronous; private bool _isVoid; private Type? _resultType; - public ResilienceStrategyConversionExtensionsTests() + public ResiliencePipelineConversionExtensionsTests() { _strategy = new TestResilienceStrategy { @@ -35,7 +35,7 @@ public ResilienceStrategyConversionExtensionsTests() } }; - _genericStrategy = new CompositeStrategyBuilder() + _genericStrategy = new ResiliencePipelineBuilder() .AddStrategy(_strategy) .Build(); } @@ -50,7 +50,7 @@ public void AsSyncPolicy_Ok() [Incoming.Key] = "incoming-value" }; - _strategy.AsStrategy().AsSyncPolicy().Execute(_ => + _strategy.AsPipeline().AsSyncPolicy().Execute(_ => { context[Executing.Key] = "executing-value"; }, @@ -86,7 +86,7 @@ public void AsSyncPolicy_Result_Ok() [Incoming.Key] = "incoming-value" }; - var result = _strategy.AsStrategy().AsSyncPolicy().Execute(_ => { context[Executing.Key] = "executing-value"; return "dummy"; }, context); + var result = _strategy.AsPipeline().AsSyncPolicy().Execute(_ => { context[Executing.Key] = "executing-value"; return "dummy"; }, context); AssertContext(context); result.Should().Be("dummy"); @@ -102,7 +102,7 @@ public async Task AsAsyncPolicy_Ok() [Incoming.Key] = "incoming-value" }; - await _strategy.AsStrategy().AsAsyncPolicy().ExecuteAsync(_ => + await _strategy.AsPipeline().AsAsyncPolicy().ExecuteAsync(_ => { context[Executing.Key] = "executing-value"; return Task.CompletedTask; @@ -144,7 +144,7 @@ public async Task AsAsyncPolicy_Result_Ok() [Incoming.Key] = "incoming-value" }; - var result = await _strategy.AsStrategy().AsAsyncPolicy().ExecuteAsync(_ => + var result = await _strategy.AsPipeline().AsAsyncPolicy().ExecuteAsync(_ => { context[Executing.Key] = "executing-value"; return Task.FromResult("dummy"); @@ -158,7 +158,7 @@ public async Task AsAsyncPolicy_Result_Ok() [Fact] public void RetryStrategy_AsSyncPolicy_Ok() { - var policy = new CompositeStrategyBuilder() + var policy = new ResiliencePipelineBuilder() .AddRetry(new RetryStrategyOptions { ShouldHandle = _ => PredicateResult.True, diff --git a/test/Polly.TestUtils/NonReactiveStrategyExtensions.cs b/test/Polly.TestUtils/NonReactiveStrategyExtensions.cs deleted file mode 100644 index c1c2f6786b9..00000000000 --- a/test/Polly.TestUtils/NonReactiveStrategyExtensions.cs +++ /dev/null @@ -1,14 +0,0 @@ -using Polly.Utils; - -namespace Polly.TestUtils; - -public static class NonReactiveStrategyExtensions -{ - public static ResilienceStrategy AsStrategy(this NonReactiveResilienceStrategy strategy) => new NonReactiveResilienceStrategyBridge(strategy); - - public static TBuilder AddStrategy(this TBuilder builder, NonReactiveResilienceStrategy strategy) - where TBuilder : CompositeStrategyBuilderBase - { - return builder.AddStrategy(strategy.AsStrategy()); - } -} diff --git a/test/Polly.TestUtils/ResilienceStrategyExtensions.cs b/test/Polly.TestUtils/ResilienceStrategyExtensions.cs new file mode 100644 index 00000000000..8e172137be9 --- /dev/null +++ b/test/Polly.TestUtils/ResilienceStrategyExtensions.cs @@ -0,0 +1,14 @@ +using Polly.Utils; + +namespace Polly.TestUtils; + +public static class ResilienceStrategyExtensions +{ + public static ResiliencePipeline AsPipeline(this ResilienceStrategy strategy) => new ResiliencePipelineBridge(strategy); + + public static TBuilder AddStrategy(this TBuilder builder, ResilienceStrategy strategy) + where TBuilder : ResiliencePipelineBuilderBase + { + return builder.AddPipeline(strategy.AsPipeline()); + } +} diff --git a/test/Polly.TestUtils/TestResiliencePipeline.TResult.cs b/test/Polly.TestUtils/TestResiliencePipeline.TResult.cs new file mode 100644 index 00000000000..eac95244cd2 --- /dev/null +++ b/test/Polly.TestUtils/TestResiliencePipeline.TResult.cs @@ -0,0 +1,9 @@ +namespace Polly.TestUtils; + +public class TestResiliencePipeline : ResiliencePipeline +{ + public TestResiliencePipeline() + : base(new TestResilienceStrategy().AsPipeline()) + { + } +} diff --git a/test/Polly.TestUtils/TestResilienceStrategy.TResult.cs b/test/Polly.TestUtils/TestResilienceStrategy.TResult.cs deleted file mode 100644 index 12ed008e15a..00000000000 --- a/test/Polly.TestUtils/TestResilienceStrategy.TResult.cs +++ /dev/null @@ -1,9 +0,0 @@ -namespace Polly.TestUtils; - -public class TestResilienceStrategy : ResilienceStrategy -{ - public TestResilienceStrategy() - : base(new TestResilienceStrategy().AsStrategy()) - { - } -} diff --git a/test/Polly.TestUtils/TestResilienceStrategy.cs b/test/Polly.TestUtils/TestResilienceStrategy.cs index f84f0201a86..56629a3d7a9 100644 --- a/test/Polly.TestUtils/TestResilienceStrategy.cs +++ b/test/Polly.TestUtils/TestResilienceStrategy.cs @@ -1,6 +1,6 @@ namespace Polly.TestUtils; -public class TestResilienceStrategy : NonReactiveResilienceStrategy +public class TestResilienceStrategy : ResilienceStrategy { public Action? Before { get; set; } diff --git a/test/Polly.Testing.Tests/ResilienceStrategyExtensionsTests.cs b/test/Polly.Testing.Tests/ResiliencePipelineExtensionsTests.cs similarity index 85% rename from test/Polly.Testing.Tests/ResilienceStrategyExtensionsTests.cs rename to test/Polly.Testing.Tests/ResiliencePipelineExtensionsTests.cs index 097290e7eb0..681c63fdcd9 100644 --- a/test/Polly.Testing.Tests/ResilienceStrategyExtensionsTests.cs +++ b/test/Polly.Testing.Tests/ResiliencePipelineExtensionsTests.cs @@ -9,13 +9,13 @@ namespace Polly.Testing.Tests; -public class ResilienceStrategyExtensionsTests +public class ResiliencePipelineExtensionsTests { [Fact] - public void GetInnerStrategies_Generic_Ok() + public void GetPipelineDescriptor_Generic_Ok() { // arrange - var strategy = new CompositeStrategyBuilder() + var strategy = new ResiliencePipelineBuilder() .AddFallback(new() { FallbackAction = _ => Outcome.FromResultAsTask("dummy"), @@ -30,7 +30,7 @@ public void GetInnerStrategies_Generic_Ok() .Build(); // act - var descriptor = strategy.GetInnerStrategies(); + var descriptor = strategy.GetPipelineDescriptor(); // assert descriptor.IsReloadable.Should().BeFalse(); @@ -57,10 +57,10 @@ public void GetInnerStrategies_Generic_Ok() } [Fact] - public void GetInnerStrategies_NonGeneric_Ok() + public void GetPipelineDescriptor_NonGeneric_Ok() { // arrange - var strategy = new CompositeStrategyBuilder() + var strategy = new ResiliencePipelineBuilder() .AddRetry(new()) .AddCircuitBreaker(new()) .AddTimeout(TimeSpan.FromSeconds(1)) @@ -70,7 +70,7 @@ public void GetInnerStrategies_NonGeneric_Ok() .Build(); // act - var descriptor = strategy.GetInnerStrategies(); + var descriptor = strategy.GetPipelineDescriptor(); // assert descriptor.IsReloadable.Should().BeFalse(); @@ -92,15 +92,15 @@ public void GetInnerStrategies_NonGeneric_Ok() } [Fact] - public void GetInnerStrategies_SingleStrategy_Ok() + public void GetPipelineDescriptor_SingleStrategy_Ok() { // arrange - var strategy = new CompositeStrategyBuilder() + var strategy = new ResiliencePipelineBuilder() .AddTimeout(TimeSpan.FromSeconds(1)) .Build(); // act - var descriptor = strategy.GetInnerStrategies(); + var descriptor = strategy.GetPipelineDescriptor(); // assert descriptor.IsReloadable.Should().BeFalse(); @@ -109,10 +109,10 @@ public void GetInnerStrategies_SingleStrategy_Ok() } [Fact] - public void GetInnerStrategies_Reloadable_Ok() + public void GetPipelineDescriptor_Reloadable_Ok() { // arrange - var strategy = new ResilienceStrategyRegistry().GetOrAddStrategy("dummy", (builder, context) => + var strategy = new ResiliencePipelineRegistry().GetOrAddPipeline("dummy", (builder, context) => { context.EnableReloads(() => () => CancellationToken.None); @@ -122,7 +122,7 @@ public void GetInnerStrategies_Reloadable_Ok() }); // act - var descriptor = strategy.GetInnerStrategies(); + var descriptor = strategy.GetPipelineDescriptor(); // assert descriptor.IsReloadable.Should().BeTrue(); @@ -131,7 +131,7 @@ public void GetInnerStrategies_Reloadable_Ok() descriptor.Strategies[1].StrategyInstance.GetType().Should().Be(typeof(CustomStrategy)); } - private sealed class CustomStrategy : NonReactiveResilienceStrategy + private sealed class CustomStrategy : ResilienceStrategy { protected override ValueTask> ExecuteCore(Func>> callback, ResilienceContext context, TState state) => throw new NotSupportedException();