/// <summary>
 /// Adds and configures custom resilience policies.
 /// </summary>
 /// <param name="clientBuilder">Configured HttpClient builder.</param>
 /// <param name="settings">Custom resilience policy settings.</param>
 /// <returns>An <see cref="IHttpClientBuilder"/> that can be used to configure the client.</returns>
 public static IHttpClientBuilder AddResiliencePolicies(
     this IHttpClientBuilder clientBuilder,
     ResiliencePoliciesSettings settings)
 {
     return(clientBuilder
            .AddTimeoutPolicy(settings.OverallTimeoutPolicySettings)
            .AddRetryPolicy(settings.RetrySettings)
            .AddCircuitBreakerPolicy(settings.CircuitBreakerSettings)
            .AddTimeoutPolicy(settings.TimeoutPerTryPolicySettings));
 }
        /// <summary>
        /// Adds the <see cref="IHttpClientFactory"/> and related services to the <see cref="IServiceCollection"/>
        /// with pre-configured JSON headers and custom resilience policies.
        /// </summary>
        /// <returns>An <see cref="IHttpClientBuilder"/> that can be used to configure the client.</returns>
        public static IHttpClientBuilder AddJsonClient <TClientInterface, TClientImplementation>(
            this IServiceCollection sc,
            Uri baseAddress,
            ResiliencePoliciesSettings settings,
            string clientName = null) where TClientInterface : class
            where TClientImplementation : class, TClientInterface
        {
            var delta = TimeSpan.FromMilliseconds(1000);

            void DefaultClient(HttpClient client)
            {
                client.BaseAddress = baseAddress;
                client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
                client.Timeout = settings.OverallTimeout + delta;
            }

            var httpClientBuilder = string.IsNullOrEmpty(clientName)
                                ? sc.AddHttpClient <TClientInterface, TClientImplementation>(DefaultClient)
                                : sc.AddHttpClient <TClientInterface, TClientImplementation>(clientName, DefaultClient);

            httpClientBuilder.AddResiliencePolicies(settings);

            return(httpClientBuilder);
        }