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