diff --git a/src/clients/Elsa.Api.Client/Contracts/IApiHttpRequestConfigurator.cs b/src/clients/Elsa.Api.Client/Contracts/IApiHttpRequestConfigurator.cs
deleted file mode 100644
index cdb295457..000000000
--- a/src/clients/Elsa.Api.Client/Contracts/IApiHttpRequestConfigurator.cs
+++ /dev/null
@@ -1,12 +0,0 @@
-namespace Elsa.Api.Client.Contracts;
-
-///
-/// An interface for classes that can configure an HTTP request made to the API.
-///
-public interface IApiHttpRequestConfigurator
-{
- ///
- /// Configures the HTTP request.
- ///
- Task ConfigureRequestAsync(HttpRequestMessage request, CancellationToken cancellationToken);
-}
\ No newline at end of file
diff --git a/src/clients/Elsa.Api.Client/Contracts/IHttpMessageHandlerProvider.cs b/src/clients/Elsa.Api.Client/Contracts/IHttpMessageHandlerProvider.cs
new file mode 100644
index 000000000..1eea665d4
--- /dev/null
+++ b/src/clients/Elsa.Api.Client/Contracts/IHttpMessageHandlerProvider.cs
@@ -0,0 +1,12 @@
+namespace Elsa.Api.Client.Contracts;
+
+///
+/// Provides an instance.
+///
+public interface IHttpMessageHandlerProvider
+{
+ ///
+ /// Returns an instance.
+ ///
+ HttpMessageHandler GetHandler();
+}
\ No newline at end of file
diff --git a/src/clients/Elsa.Api.Client/Extensions/DependencyInjectionExtensions.cs b/src/clients/Elsa.Api.Client/Extensions/DependencyInjectionExtensions.cs
index 525cbd5ca..5e282400d 100644
--- a/src/clients/Elsa.Api.Client/Extensions/DependencyInjectionExtensions.cs
+++ b/src/clients/Elsa.Api.Client/Extensions/DependencyInjectionExtensions.cs
@@ -31,23 +31,31 @@ public static class DependencyInjectionExtensions
/// Adds the Elsa client to the service collection.
///
public static IServiceCollection AddElsaClient(this IServiceCollection services, Action? configureOptions = default)
+ {
+ return services.AddElsaClient(builder => builder.AddHttpMessageHandler() , configureOptions);
+ }
+
+ ///
+ /// Adds the Elsa client to the service collection.
+ ///
+ public static IServiceCollection AddElsaClient(this IServiceCollection services, Action configureHttpClientBuilder, Action? configureOptions = default)
{
services.Configure(configureOptions ?? (_ => { }));
services.AddScoped();
services.AddScoped();
- services.AddApi(CreateRefitSettings);
- services.AddApi(CreateRefitSettings);
- services.AddApi(CreateRefitSettings);
- services.AddApi(CreateRefitSettings);
- services.AddApi(CreateRefitSettings);
- services.AddApi(CreateRefitSettings);
- services.AddApi(CreateRefitSettings);
- services.AddApi(CreateRefitSettings);
- services.AddApi(CreateRefitSettings);
+ services.AddApi(CreateRefitSettings, configureHttpClientBuilder);
+ services.AddApi(CreateRefitSettings, configureHttpClientBuilder);
+ services.AddApi(CreateRefitSettings, configureHttpClientBuilder);
+ services.AddApi(CreateRefitSettings, configureHttpClientBuilder);
+ services.AddApi(CreateRefitSettings, configureHttpClientBuilder);
+ services.AddApi(CreateRefitSettings, configureHttpClientBuilder);
+ services.AddApi(CreateRefitSettings, configureHttpClientBuilder);
+ services.AddApi(CreateRefitSettings, configureHttpClientBuilder);
+ services.AddApi(CreateRefitSettings, configureHttpClientBuilder);
return services;
}
-
+
///
/// Adds a refit client for the specified API type.
///
@@ -56,9 +64,20 @@ public static class DependencyInjectionExtensions
/// The API type.
public static void AddApi(this IServiceCollection services, Func settings) where T : class
{
- services.AddRefitClient(settings)
- .ConfigureHttpClient(ConfigureElsaApiHttpClient)
- .AddHttpMessageHandler();
+ services.AddApi(settings, builder => builder.AddHttpMessageHandler());
+ }
+
+ ///
+ /// Adds a refit client for the specified API type.
+ ///
+ /// The service collection.
+ /// The refit settings.
+ /// A delegate to configure the HTTP client builder.
+ /// The API type.
+ public static void AddApi(this IServiceCollection services, Func settings, Action configureHttpClientBuilder) where T : class
+ {
+ var builder = services.AddRefitClient(settings).ConfigureHttpClient(ConfigureElsaApiHttpClient);
+ configureHttpClientBuilder(builder);
}
///
@@ -68,6 +87,14 @@ public static class DependencyInjectionExtensions
{
return RestService.For(baseAddress.ToString(), CreateRefitSettings(serviceProvider));
}
+
+ ///
+ /// Creates an API client for the specified API type.
+ ///
+ public static T CreateApi(this IServiceProvider serviceProvider, HttpClient httpClient) where T : class
+ {
+ return RestService.For(httpClient, CreateRefitSettings(serviceProvider));
+ }
private static void ConfigureElsaApiHttpClient(IServiceProvider serviceProvider, HttpClient httpClient)
{
@@ -93,6 +120,7 @@ public static class DependencyInjectionExtensions
var settings = new RefitSettings
{
ContentSerializer = new SystemTextJsonContentSerializer(serializerOptions),
+ HttpMessageHandlerFactory = serviceProvider.GetRequiredService
};
return settings;
diff --git a/src/clients/Elsa.Api.Client/HttpMessageHandlers/ApiHttpMessageHandler.cs b/src/clients/Elsa.Api.Client/HttpMessageHandlers/ApiHttpMessageHandler.cs
index a22a04f77..84bc5fd03 100644
--- a/src/clients/Elsa.Api.Client/HttpMessageHandlers/ApiHttpMessageHandler.cs
+++ b/src/clients/Elsa.Api.Client/HttpMessageHandlers/ApiHttpMessageHandler.cs
@@ -1,28 +1,19 @@
using Elsa.Api.Client.Contracts;
+using Microsoft.Extensions.DependencyInjection;
namespace Elsa.Api.Client.HttpMessageHandlers;
///
-/// An HTTP message handler that invokes instances before sending the request.
+/// An HTTP message handler that delegates its processing to another instance provided by an .
///
public class ApiHttpMessageHandler : DelegatingHandler
{
- private readonly IEnumerable _httpClientConfigurators;
-
///
- public ApiHttpMessageHandler(IEnumerable httpClientConfigurators)
+ public ApiHttpMessageHandler(IServiceProvider serviceProvider)
{
- _httpClientConfigurators = httpClientConfigurators;
- }
+ var provider = serviceProvider.GetService();
- ///
- protected override async Task SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
- {
- // Invoke configurators.
- foreach (var httpClientConfigurator in _httpClientConfigurators)
- await httpClientConfigurator.ConfigureRequestAsync(request, cancellationToken);
-
- // Continue processing the request
- return await base.SendAsync(request, cancellationToken);
+ if (provider != null)
+ InnerHandler = provider.GetHandler();
}
}
\ No newline at end of file