ResilienceStrategyBuilderBase
A builder that is used to create an instance of ResilienceStrategy.
using Polly.Utils;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.ComponentModel.DataAnnotations;
using System.Diagnostics;
using System.Linq;
using System.Runtime.CompilerServices;
using System.Text;
namespace Polly
{
[System.Runtime.CompilerServices.NullableContext(1)]
[System.Runtime.CompilerServices.Nullable(0)]
public abstract class ResilienceStrategyBuilderBase
{
[System.Runtime.CompilerServices.Nullable(0)]
private sealed class Entry : IEquatable<Entry>
{
[CompilerGenerated]
private Type EqualityContract {
[CompilerGenerated]
get {
return typeof(Entry);
}
}
public Func<ResilienceStrategyBuilderContext, ResilienceStrategy> Factory { get; set; }
public ResilienceStrategyOptions Properties { get; set; }
public Entry(Func<ResilienceStrategyBuilderContext, ResilienceStrategy> Factory, ResilienceStrategyOptions Properties)
{
Factory = Factory;
Properties = Properties;
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(", Properties = ");
builder.Append(Properties);
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<ResilienceStrategyBuilderContext, ResilienceStrategy>>.Default.GetHashCode(Factory)) * -1521134295 + EqualityComparer<ResilienceStrategyOptions>.Default.GetHashCode(Properties);
}
[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<ResilienceStrategyBuilderContext, ResilienceStrategy>>.Default.Equals(Factory, other.Factory))
return EqualityComparer<ResilienceStrategyOptions>.Default.Equals(Properties, other.Properties);
return false;
}
return true;
}
[CompilerGenerated]
private Entry(Entry original)
{
Factory = original.Factory;
Properties = original.Properties;
}
[CompilerGenerated]
public void Deconstruct(out Func<ResilienceStrategyBuilderContext, ResilienceStrategy> Factory, out ResilienceStrategyOptions Properties)
{
Factory = this.Factory;
Properties = this.Properties;
}
}
private readonly List<Entry> _entries = new List<Entry>();
private bool _used;
[System.Runtime.CompilerServices.Nullable(2)]
[field: System.Runtime.CompilerServices.Nullable(2)]
public string BuilderName {
[System.Runtime.CompilerServices.NullableContext(2)]
get;
[System.Runtime.CompilerServices.NullableContext(2)]
set;
}
public ResilienceProperties Properties { get; } = new ResilienceProperties();
[Required]
internal TimeProvider TimeProvider { get; set; } = TimeProvider.System;
[System.Runtime.CompilerServices.Nullable(new byte[] {
2,
1,
1
})]
[EditorBrowsable(EditorBrowsableState.Never)]
[field: System.Runtime.CompilerServices.Nullable(new byte[] {
2,
1,
1
})]
public Action<IList<ResilienceStrategy>> OnCreatingStrategy {
[return: System.Runtime.CompilerServices.Nullable(new byte[] {
2,
1,
1
})]
get;
[param: System.Runtime.CompilerServices.Nullable(new byte[] {
2,
1,
1
})]
set;
}
[System.Runtime.CompilerServices.Nullable(2)]
[EditorBrowsable(EditorBrowsableState.Never)]
[field: System.Runtime.CompilerServices.Nullable(2)]
public DiagnosticSource DiagnosticSource {
[System.Runtime.CompilerServices.NullableContext(2)]
get;
[System.Runtime.CompilerServices.NullableContext(2)]
set;
}
[EditorBrowsable(EditorBrowsableState.Never)]
[Required]
public Func<double> Randomizer { get; set; } = RandomUtil.Instance.NextDouble;
internal abstract bool IsGenericBuilder { get; }
private protected ResilienceStrategyBuilderBase()
{
}
private protected ResilienceStrategyBuilderBase(ResilienceStrategyBuilderBase other)
{
BuilderName = other.BuilderName;
Properties = other.Properties;
TimeProvider = other.TimeProvider;
OnCreatingStrategy = other.OnCreatingStrategy;
Randomizer = other.Randomizer;
DiagnosticSource = other.DiagnosticSource;
}
internal void AddStrategyCore(Func<ResilienceStrategyBuilderContext, ResilienceStrategy> factory, ResilienceStrategyOptions options)
{
Guard.NotNull(factory, "factory");
Guard.NotNull(options, "options");
ValidationHelper.ValidateObject(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 strategy once.");
_entries.Add(new Entry(factory, options));
}
internal ResilienceStrategy BuildStrategy()
{
ValidationHelper.ValidateObject(this, "The 'ResilienceStrategyBuilder' configuration is invalid.");
_used = true;
List<ResilienceStrategy> list = _entries.Select(CreateResilienceStrategy).ToList();
OnCreatingStrategy?.Invoke(list);
if (list.Count == 0)
return NullResilienceStrategy.Instance;
if (list.Count == 1)
return list[0];
return ResilienceStrategyPipeline.CreatePipeline(list);
}
private ResilienceStrategy CreateResilienceStrategy(Entry entry)
{
ResilienceStrategyBuilderContext arg = new ResilienceStrategyBuilderContext(BuilderName, Properties, entry.Properties.StrategyName, entry.Properties.StrategyType, TimeProvider, IsGenericBuilder, DiagnosticSource, Randomizer);
return entry.Factory(arg);
}
}
}