ResiliencePipelineBuilderBase
A builder that is used to create an instance of ResiliencePipeline.
using Polly.Telemetry;
using Polly.Utils;
using Polly.Utils.Pipeline;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Diagnostics.CodeAnalysis;
using System.Linq;
using System.Runtime.CompilerServices;
using System.Text;
namespace Polly
{
[System.Runtime.CompilerServices.NullableContext(2)]
[System.Runtime.CompilerServices.Nullable(0)]
public abstract class ResiliencePipelineBuilderBase
{
[System.Runtime.CompilerServices.NullableContext(1)]
[System.Runtime.CompilerServices.Nullable(0)]
private sealed class Entry : IEquatable<Entry>
{
[CompilerGenerated]
private Type EqualityContract {
[CompilerGenerated]
get {
return typeof(Entry);
}
}
public Func<StrategyBuilderContext, PipelineComponent> Factory { get; set; }
public ResilienceStrategyOptions Options { get; set; }
public Entry(Func<StrategyBuilderContext, PipelineComponent> Factory, ResilienceStrategyOptions Options)
{
Factory = Factory;
Options = Options;
base..ctor();
}
[CompilerGenerated]
public override string ToString()
{
StringBuilder stringBuilder = new StringBuilder();
stringBuilder.Append("Entry");
stringBuilder.Append(" { ");
if (PrintMembers(stringBuilder))
stringBuilder.Append(' ');
stringBuilder.Append('}');
return stringBuilder.ToString();
}
[CompilerGenerated]
private bool PrintMembers(StringBuilder builder)
{
RuntimeHelpers.EnsureSufficientExecutionStack();
builder.Append("Factory = ");
builder.Append(Factory);
builder.Append(", Options = ");
builder.Append(Options);
return true;
}
public static bool operator !=(Entry left, Entry right)
{
return !(left == right);
}
public static bool operator ==(Entry left, Entry right)
{
if ((object)left != right)
return left?.Equals(right) ?? false;
return true;
}
[CompilerGenerated]
public override int GetHashCode()
{
return (EqualityComparer<Type>.Default.GetHashCode(EqualityContract) * -1521134295 + EqualityComparer<Func<StrategyBuilderContext, PipelineComponent>>.Default.GetHashCode(Factory)) * -1521134295 + EqualityComparer<ResilienceStrategyOptions>.Default.GetHashCode(Options);
}
[System.Runtime.CompilerServices.NullableContext(2)]
[CompilerGenerated]
public override bool Equals(object obj)
{
return Equals(obj as Entry);
}
[System.Runtime.CompilerServices.NullableContext(2)]
[CompilerGenerated]
public bool Equals(Entry other)
{
if ((object)this != other) {
if ((object)other != null && EqualityContract == other.EqualityContract && EqualityComparer<Func<StrategyBuilderContext, PipelineComponent>>.Default.Equals(Factory, other.Factory))
return EqualityComparer<ResilienceStrategyOptions>.Default.Equals(Options, other.Options);
return false;
}
return true;
}
[CompilerGenerated]
private Entry(Entry original)
{
Factory = original.Factory;
Options = original.Options;
}
[CompilerGenerated]
public void Deconstruct(out Func<StrategyBuilderContext, PipelineComponent> Factory, out ResilienceStrategyOptions Options)
{
Factory = this.Factory;
Options = this.Options;
}
}
[System.Runtime.CompilerServices.Nullable(1)]
private readonly List<Entry> _entries = new List<Entry>();
private bool _used;
public string Name { get; set; }
public string InstanceName { get; set; }
public ResilienceContextPool ContextPool { get; set; }
public TimeProvider TimeProvider { get; set; }
[EditorBrowsable(EditorBrowsableState.Never)]
public TelemetryListener TelemetryListener { get; set; }
[System.Runtime.CompilerServices.Nullable(1)]
internal TimeProvider TimeProviderInternal {
[System.Runtime.CompilerServices.NullableContext(1)]
get {
return TimeProvider ?? TimeProvider.System;
}
}
[System.Runtime.CompilerServices.Nullable(1)]
[field: System.Runtime.CompilerServices.Nullable(1)]
internal Action<ResilienceValidationContext> Validator {
[System.Runtime.CompilerServices.NullableContext(1)]
get;
[System.Runtime.CompilerServices.NullableContext(1)]
private protected set;
} = ValidationHelper.ValidateObject;
private protected ResiliencePipelineBuilderBase()
{
}
[System.Runtime.CompilerServices.NullableContext(1)]
private protected ResiliencePipelineBuilderBase(ResiliencePipelineBuilderBase other)
{
Name = other.Name;
TimeProvider = other.TimeProvider;
TelemetryListener = other.TelemetryListener;
}
[System.Runtime.CompilerServices.NullableContext(1)]
[RequiresUnreferencedCode("This call validates the options using the data annotations attributes.\r\nMake sure that the options are included by adding the '[DynamicDependency(DynamicallyAccessedMemberTypes.All, typeof(OptionsType))]' attribute to the calling method.")]
internal void AddPipelineComponent(Func<StrategyBuilderContext, PipelineComponent> factory, ResilienceStrategyOptions options)
{
Guard.NotNull(factory, "factory");
Guard.NotNull(options, "options");
Validator(new ResilienceValidationContext(options, "The '" + TypeNameFormatter.Format(options.GetType()) + "' are invalid."));
if (_used)
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));
}
[System.Runtime.CompilerServices.NullableContext(1)]
internal PipelineComponent BuildPipelineComponent()
{
Validator(new ResilienceValidationContext(this, "The 'ResiliencePipelineBuilder' configuration is invalid."));
_used = true;
List<PipelineComponent> list = _entries.Select(CreateComponent).ToList();
if (list.Count == 0)
return PipelineComponent.Empty;
ResilienceTelemetrySource source = new ResilienceTelemetrySource(Name, InstanceName, null);
return PipelineComponentFactory.CreateComposite(list, new ResilienceStrategyTelemetry(source, TelemetryListener), TimeProviderInternal);
}
[System.Runtime.CompilerServices.NullableContext(1)]
private PipelineComponent CreateComponent(Entry entry)
{
StrategyBuilderContext arg = new StrategyBuilderContext(new ResilienceStrategyTelemetry(new ResilienceTelemetrySource(Name, InstanceName, entry.Options.Name), TelemetryListener), TimeProviderInternal);
PipelineComponent pipelineComponent = entry.Factory(arg);
pipelineComponent.Options = entry.Options;
return pipelineComponent;
}
}
}