Skip to content

[Feature request]: Add AddStrategy API with no options #1985

@eerhardt

Description

@eerhardt

Is your feature request related to a specific problem? Or an existing feature?

The AddStrategy extension methods take a ResilienceStrategyOptions options argument, which gets validated using DataAnnotations. This makes the method incompatible with trimming and native AOT, and it is annotated as such:

[RequiresUnreferencedCode(Constants.OptionsValidation)]
public static TBuilder AddStrategy<TBuilder>(this TBuilder builder, Func<StrategyBuilderContext, ResilienceStrategy> factory, ResilienceStrategyOptions options)
where TBuilder : ResiliencePipelineBuilderBase

[RequiresUnreferencedCode(Constants.OptionsValidation)]
public static ResiliencePipelineBuilder AddStrategy(
this ResiliencePipelineBuilder builder, Func<StrategyBuilderContext, ResilienceStrategy<object>> factory,
ResilienceStrategyOptions options)

[RequiresUnreferencedCode(Constants.OptionsValidation)]
public static ResiliencePipelineBuilder<TResult> AddStrategy<TResult>(
this ResiliencePipelineBuilder<TResult> builder, Func<StrategyBuilderContext, ResilienceStrategy<TResult>> factory,
ResilienceStrategyOptions options)

Callers who want to use this API in a trim compatible way need to define an empty class derived from ResilienceStrategyOptions and suppress the warning from calling this API.

Describe the solution you'd like

We should add overloads to these AddStrategy methods that are trim compatible, and don't take an options argument. Similar to the AddPipeline methods.

 [RequiresUnreferencedCode(Constants.OptionsValidation)] 
 public static TBuilder AddStrategy<TBuilder>(this TBuilder builder, Func<StrategyBuilderContext, ResilienceStrategy> factory, ResilienceStrategyOptions options) 
     where TBuilder : ResiliencePipelineBuilderBase  {}

+public static TBuilder AddStrategy<TBuilder>(this TBuilder builder, Func<StrategyBuilderContext, ResilienceStrategy> factory) 
+    where TBuilder : ResiliencePipelineBuilderBase  {}

 [RequiresUnreferencedCode(Constants.OptionsValidation)] 
 public static ResiliencePipelineBuilder AddStrategy( 
     this ResiliencePipelineBuilder builder, Func<StrategyBuilderContext, ResilienceStrategy<object>> factory, 
     ResilienceStrategyOptions options) {}

+public static ResiliencePipelineBuilder AddStrategy(
+    this ResiliencePipelineBuilder builder, Func<StrategyBuilderContext, ResilienceStrategy<object>> factory) {}

 [RequiresUnreferencedCode(Constants.OptionsValidation)] 
 public static ResiliencePipelineBuilder<TResult> AddStrategy<TResult>( 
     this ResiliencePipelineBuilder<TResult> builder, Func<StrategyBuilderContext, ResilienceStrategy<TResult>> factory, 
     ResilienceStrategyOptions options) {}

+ public static ResiliencePipelineBuilder<TResult> AddStrategy<TResult>(
+    this ResiliencePipelineBuilder<TResult> builder, Func<StrategyBuilderContext, ResilienceStrategy<TResult>> factory) {}

Additional context

This is being used by Microsoft.Extensions.Http.Resilience here:
dotnet/extensions#4962 (comment)

Adding this API would make the caller simpler. It wouldn't need to declare an empty class, and suppress the trim warning.

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions