From 259b337dc2aaea46bd2f942c1fad30bbb953d1fc Mon Sep 17 00:00:00 2001 From: Martin Tomka Date: Mon, 21 Aug 2023 10:15:33 +0200 Subject: [PATCH] Minor ResiliencePipelineRegistry cleanup of internals --- .../ConcurrentDictionaryExtensions.cs | 16 +++++++++++++ .../ResiliencePipelineRegistry.TResult.cs | 24 +++++++++---------- .../Registry/ResiliencePipelineRegistry.cs | 8 +++---- 3 files changed, 30 insertions(+), 18 deletions(-) create mode 100644 src/LegacySupport/ConcurrentDictionaryExtensions.cs diff --git a/src/LegacySupport/ConcurrentDictionaryExtensions.cs b/src/LegacySupport/ConcurrentDictionaryExtensions.cs new file mode 100644 index 00000000000..e5effcace6e --- /dev/null +++ b/src/LegacySupport/ConcurrentDictionaryExtensions.cs @@ -0,0 +1,16 @@ +namespace System.Collections.Concurrent; + +#if !NETCOREAPP +internal static class ConcurrentDictionaryExtensions +{ + public static TValue GetOrAdd(this ConcurrentDictionary dictionary, TKey key, Func valueFactory, TArg factoryArgument) + { + if (dictionary.TryGetValue(key, out TValue value)) + { + return value; + } + + return dictionary.GetOrAdd(key, valueFactory(key, factoryArgument)); + } +} +#endif diff --git a/src/Polly.Core/Registry/ResiliencePipelineRegistry.TResult.cs b/src/Polly.Core/Registry/ResiliencePipelineRegistry.TResult.cs index 5e282e9921f..bb19b8e5821 100644 --- a/src/Polly.Core/Registry/ResiliencePipelineRegistry.TResult.cs +++ b/src/Polly.Core/Registry/ResiliencePipelineRegistry.TResult.cs @@ -9,7 +9,7 @@ private sealed class GenericRegistry : IDisposable, IAsyncDisposable { private readonly Func> _activator; private readonly ConcurrentDictionary, ConfigureBuilderContext>> _builders; - private readonly ConcurrentDictionary> _strategies; + private readonly ConcurrentDictionary> _pipelines; private readonly Func _builderNameFormatter; private readonly Func? _instanceNameFormatter; @@ -23,14 +23,14 @@ public GenericRegistry( { _activator = activator; _builders = new ConcurrentDictionary, ConfigureBuilderContext>>(builderComparer); - _strategies = new ConcurrentDictionary>(strategyComparer); + _pipelines = new ConcurrentDictionary>(strategyComparer); _builderNameFormatter = builderNameFormatter; _instanceNameFormatter = instanceNameFormatter; } public bool TryGet(TKey key, [NotNullWhen(true)] out ResiliencePipeline? strategy) { - if (_strategies.TryGetValue(key, out strategy)) + if (_pipelines.TryGetValue(key, out strategy)) { return true; } @@ -49,37 +49,35 @@ public ResiliencePipeline GetOrAdd(TKey key, Action(key, _builderNameFormatter(key), _instanceNameFormatter?.Invoke(key)); -#if NETCOREAPP3_0_OR_GREATER - return _strategies.GetOrAdd(key, static (_, factory) => + return _pipelines.GetOrAdd(key, static (_, factory) => { - return new ResiliencePipeline(CreatePipelineComponent(factory.instance._activator, factory.context, factory.configure), DisposeBehavior.Reject); + var component = CreatePipelineComponent(factory.instance._activator, factory.context, factory.configure); + + return new ResiliencePipeline(component, DisposeBehavior.Reject); }, (instance: this, context, configure)); -#else - return _strategies.GetOrAdd(key, _ => new ResiliencePipeline(CreatePipelineComponent(_activator, context, configure), DisposeBehavior.Reject)); -#endif } public bool TryAddBuilder(TKey key, Action, ConfigureBuilderContext> configure) => _builders.TryAdd(key, configure); public void Dispose() { - foreach (var strategy in _strategies.Values) + foreach (var strategy in _pipelines.Values) { strategy.DisposeHelper.ForceDispose(); } - _strategies.Clear(); + _pipelines.Clear(); } public async ValueTask DisposeAsync() { - foreach (var strategy in _strategies.Values) + foreach (var strategy in _pipelines.Values) { await strategy.DisposeHelper.ForceDisposeAsync().ConfigureAwait(false); } - _strategies.Clear(); + _pipelines.Clear(); } } } diff --git a/src/Polly.Core/Registry/ResiliencePipelineRegistry.cs b/src/Polly.Core/Registry/ResiliencePipelineRegistry.cs index 9fbd0bd3503..6b1c579da36 100644 --- a/src/Polly.Core/Registry/ResiliencePipelineRegistry.cs +++ b/src/Polly.Core/Registry/ResiliencePipelineRegistry.cs @@ -126,15 +126,13 @@ public ResiliencePipeline GetOrAddPipeline(TKey key, Action(key, _builderNameFormatter(key), _instanceNameFormatter?.Invoke(key)); -#if NETCOREAPP3_0_OR_GREATER return _pipelines.GetOrAdd(key, static (_, factory) => { - return new ResiliencePipeline(CreatePipelineComponent(factory.instance._activator, factory.context, factory.configure), DisposeBehavior.Reject); + var component = CreatePipelineComponent(factory.instance._activator, factory.context, factory.configure); + + return new ResiliencePipeline(component, DisposeBehavior.Reject); }, (instance: this, context, configure)); -#else - return _pipelines.GetOrAdd(key, _ => new ResiliencePipeline(CreatePipelineComponent(_activator, context, configure), DisposeBehavior.Reject)); -#endif } ///