Skip to content

Commit

Permalink
refactor: Return back AddDefault policies and rename it
Browse files Browse the repository at this point in the history
See: #45
  • Loading branch information
Ceridan committed Nov 1, 2020
1 parent e5c5c48 commit 8b1bdd5
Show file tree
Hide file tree
Showing 3 changed files with 49 additions and 24 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -69,13 +69,7 @@ public HttpClientWrapper Please()
var settings = BuildClientSettings();
var services = new ServiceCollection();
services
.AddJsonClient<IMockJsonClient, MockJsonClient>(_uri, c =>
{
c.CircuitBreakerSettings = settings.CircuitBreakerSettings;
c.OverallTimeoutPolicySettings = settings.OverallTimeoutPolicySettings;
c.RetrySettings = settings.RetrySettings;
c.TimeoutPerTryPolicySettings = settings.TimeoutPerTryPolicySettings;
}, ClientName)
.AddJsonClient<IMockJsonClient, MockJsonClient>(_uri, settings, ClientName)
.ConfigurePrimaryHttpMessageHandler(() => handler);

var serviceProvider = services.BuildServiceProvider();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -65,8 +65,9 @@ public void When_AddJsonClient_WithSpecificOverallTimeout_than_ConfiguresSpecifi
// Act1
serviceCollection.AddJsonClient<IMockJsonClient, MockJsonClient>(
new Uri("http://example.com/"),
c => {
c.OverallTimeoutPolicySettings = new OverallTimeoutPolicySettings(overallTimeout);
new ResiliencePoliciesSettings
{
OverallTimeoutPolicySettings = new OverallTimeoutPolicySettings(overallTimeout),
});

var services = serviceCollection.BuildServiceProvider();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,8 @@ public static class HttpClientBuilderExtensions
string clientName = null) where TClientInterface : class
where TClientImplementation : class, TClientInterface
{
return AddJsonClient<TClientInterface, TClientImplementation>(sc, baseAddress, (s) => new ResiliencePoliciesSettings(), clientName);
return AddJsonClient<TClientInterface, TClientImplementation>(
sc, baseAddress, new ResiliencePoliciesSettings(), clientName);
}

/// <summary>
Expand All @@ -41,34 +42,61 @@ public static class HttpClientBuilderExtensions
public static IHttpClientBuilder AddJsonClient<TClientInterface, TClientImplementation>(
this IServiceCollection sc,
Uri baseAddress,
Action<ResiliencePoliciesSettings> settings,
ResiliencePoliciesSettings settings,
string clientName = null) where TClientInterface : class
where TClientImplementation : class, TClientInterface
{
var options = new ResiliencePoliciesSettings();
settings(options);

var delta = TimeSpan.FromMilliseconds(1000);
Action<HttpClient> defaultClient = (client) =>

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

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

httpClientBuilder
.AddTimeoutPolicy(options.OverallTimeoutPolicySettings)
.AddRetryPolicy(options.RetrySettings)
.AddCircuitBreakerPolicy(options.CircuitBreakerSettings)
.AddTimeoutPolicy(options.TimeoutPerTryPolicySettings);
.AddTimeoutPolicy(settings.OverallTimeoutPolicySettings)
.AddRetryPolicy(settings.RetrySettings)
.AddCircuitBreakerPolicy(settings.CircuitBreakerSettings)
.AddTimeoutPolicy(settings.TimeoutPerTryPolicySettings);

return httpClientBuilder;
}

/// <summary>
/// Adds pre-configured resilience policies.
/// </summary>
/// <param name="clientBuilder">Configured HttpClient builder.</param>
/// <returns>An <see cref="IHttpClientBuilder"/> that can be used to configure the client.</returns>
public static IHttpClientBuilder AddResiliencePolicies(
this IHttpClientBuilder clientBuilder)
{
return clientBuilder
.AddResiliencePolicies(new ResiliencePoliciesSettings());
}

/// <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);
}

private static IHttpClientBuilder AddRetryPolicy(
this IHttpClientBuilder clientBuilder,
IRetryPolicySettings settings)
Expand Down Expand Up @@ -119,7 +147,9 @@ public static class HttpClientBuilderExtensions
settings.OnHalfOpen);
}

private static IHttpClientBuilder AddTimeoutPolicy(this IHttpClientBuilder httpClientBuilder, ITimeoutPolicySettings settings)
private static IHttpClientBuilder AddTimeoutPolicy(
this IHttpClientBuilder httpClientBuilder,
ITimeoutPolicySettings settings)
{
return httpClientBuilder.AddPolicyHandler(Policy.TimeoutAsync<HttpResponseMessage>(settings.Timeout));
}
Expand Down

0 comments on commit 8b1bdd5

Please sign in to comment.