ResiliencePipelineBuilderExtensions
Extensions for ResiliencePipelineBuilderBase.
using Polly.Utils;
using Polly.Utils.Pipeline;
using System;
using System.Diagnostics.CodeAnalysis;
using System.Runtime.CompilerServices;
namespace Polly
{
[NullableContext(1)]
[Nullable(0)]
public static class ResiliencePipelineBuilderExtensions
{
[NullableContext(0)]
internal sealed class EmptyOptions : ResilienceStrategyOptions
{
[Nullable(1)]
public static readonly EmptyOptions Instance = new EmptyOptions();
}
[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 AddPipeline<[Nullable(0)] TBuilder>(this TBuilder builder, ResiliencePipeline pipeline) where TBuilder : ResiliencePipelineBuilderBase
{
Guard.NotNull(builder, "builder");
Guard.NotNull(pipeline, "pipeline");
builder.AddPipelineComponent((StrategyBuilderContext _) => PipelineComponentFactory.FromPipeline(pipeline), EmptyOptions.Instance);
return builder;
}
[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 ResiliencePipelineBuilder<TResult> AddPipeline<[Nullable(2)] TResult>(this ResiliencePipelineBuilder<TResult> builder, ResiliencePipeline<TResult> pipeline)
{
Guard.NotNull(builder, "builder");
Guard.NotNull(pipeline, "pipeline");
builder.AddPipelineComponent((StrategyBuilderContext _) => PipelineComponentFactory.FromPipeline<TResult>(pipeline), EmptyOptions.Instance);
return builder;
}
[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.")]
public static TBuilder AddStrategy<[Nullable(0)] TBuilder>(this TBuilder builder, Func<StrategyBuilderContext, ResilienceStrategy> factory, ResilienceStrategyOptions options) where TBuilder : ResiliencePipelineBuilderBase
{
Guard.NotNull(builder, "builder");
Guard.NotNull(factory, "factory");
Guard.NotNull(options, "options");
builder.AddPipelineComponent((StrategyBuilderContext context) => PipelineComponentFactory.FromStrategy(factory(context)), options);
return builder;
}
[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.")]
public static ResiliencePipelineBuilder AddStrategy(this ResiliencePipelineBuilder builder, Func<StrategyBuilderContext, ResilienceStrategy<object>> factory, ResilienceStrategyOptions options)
{
Guard.NotNull(builder, "builder");
Guard.NotNull(factory, "factory");
Guard.NotNull(options, "options");
builder.AddPipelineComponent((StrategyBuilderContext context) => PipelineComponentFactory.FromStrategy(factory(context)), options);
return builder;
}
[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.")]
public static ResiliencePipelineBuilder<TResult> AddStrategy<[Nullable(2)] TResult>(this ResiliencePipelineBuilder<TResult> builder, Func<StrategyBuilderContext, ResilienceStrategy<TResult>> factory, ResilienceStrategyOptions options)
{
Guard.NotNull(builder, "builder");
Guard.NotNull(factory, "factory");
Guard.NotNull(options, "options");
builder.AddPipelineComponent((StrategyBuilderContext context) => PipelineComponentFactory.FromStrategy<TResult>(factory(context)), options);
return builder;
}
[DynamicDependency(DynamicallyAccessedMemberTypes.All, typeof(EmptyOptions))]
[UnconditionalSuppressMessage("Trimming", "IL2026:Members annotated with 'RequiresUnreferencedCodeAttribute' require dynamic access otherwise can break functionality when trimming application code", Justification = "All options members preserved for the empty options.")]
public static TBuilder AddStrategy<[Nullable(0)] TBuilder>(this TBuilder builder, Func<StrategyBuilderContext, ResilienceStrategy> factory) where TBuilder : ResiliencePipelineBuilderBase
{
Guard.NotNull(builder, "builder");
Guard.NotNull(factory, "factory");
return builder.AddStrategy(factory, EmptyOptions.Instance);
}
[DynamicDependency(DynamicallyAccessedMemberTypes.All, typeof(EmptyOptions))]
[UnconditionalSuppressMessage("Trimming", "IL2026:Members annotated with 'RequiresUnreferencedCodeAttribute' require dynamic access otherwise can break functionality when trimming application code", Justification = "All options members preserved for the empty options.")]
public static ResiliencePipelineBuilder AddStrategy(this ResiliencePipelineBuilder builder, Func<StrategyBuilderContext, ResilienceStrategy<object>> factory)
{
Guard.NotNull(builder, "builder");
Guard.NotNull(factory, "factory");
return builder.AddStrategy(factory, EmptyOptions.Instance);
}
[DynamicDependency(DynamicallyAccessedMemberTypes.All, typeof(EmptyOptions))]
[UnconditionalSuppressMessage("Trimming", "IL2026:Members annotated with 'RequiresUnreferencedCodeAttribute' require dynamic access otherwise can break functionality when trimming application code", Justification = "All options members preserved for the empty options.")]
public static ResiliencePipelineBuilder<TResult> AddStrategy<[Nullable(2)] TResult>(this ResiliencePipelineBuilder<TResult> builder, Func<StrategyBuilderContext, ResilienceStrategy<TResult>> factory)
{
Guard.NotNull(builder, "builder");
Guard.NotNull(factory, "factory");
return builder.AddStrategy(factory, EmptyOptions.Instance);
}
}
}