diff --git a/src/clients/Elsa.Api.Client/Contracts/IElsaClientFactory.cs b/src/clients/Elsa.Api.Client/Contracts/IElsaClientFactory.cs index e196626b8..cf109850e 100644 --- a/src/clients/Elsa.Api.Client/Contracts/IElsaClientFactory.cs +++ b/src/clients/Elsa.Api.Client/Contracts/IElsaClientFactory.cs @@ -1,5 +1,4 @@ using Elsa.Api.Client.Options; -using Microsoft.Extensions.DependencyInjection; namespace Elsa.Api.Client.Contracts; @@ -11,5 +10,5 @@ public interface IElsaClientFactory /// /// Creates a new instance. /// - IElsaClient CreateClient(Action configureOptions, Action? configureHttpClientBuilder = default); + IElsaClient CreateClient(Action configureOptions, Action? configureHttpClientBuilder = default); } \ 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 449723cd7..fe8a75b8a 100644 --- a/src/clients/Elsa.Api.Client/Extensions/DependencyInjectionExtensions.cs +++ b/src/clients/Elsa.Api.Client/Extensions/DependencyInjectionExtensions.cs @@ -32,38 +32,39 @@ public static class DependencyInjectionExtensions /// /// Adds the Elsa client to the service collection. /// - public static IServiceCollection AddElsaClient(this IServiceCollection services, Action? configureOptions = default, Action? configureHttpClientBuilder = default) + public static IServiceCollection AddElsaClient(this IServiceCollection services, Action? configureOptions = default, Action? configureBuilderOptions = default) { + var builderOptions = new ElsaClientBuilderOptions(); + configureBuilderOptions?.Invoke(builderOptions); + services.Configure(configureOptions ?? (_ => { })); services.AddScoped(); services.AddScoped(); - 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); - services.AddApi(CreateRefitSettings, configureHttpClientBuilder); - services.AddApi(CreateRefitSettings, configureHttpClientBuilder); + services.AddApi(builderOptions); + services.AddApi(builderOptions); + services.AddApi(builderOptions); + services.AddApi(builderOptions); + services.AddApi(builderOptions); + services.AddApi(builderOptions); + services.AddApi(builderOptions); + services.AddApi(builderOptions); + services.AddApi(builderOptions); + services.AddApi(builderOptions); + services.AddApi(builderOptions); return services; } - + /// /// 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 = default) where T : class + /// An options object that can be used to configure the HTTP client builder. + /// The type representing the API. + public static void AddApi(this IServiceCollection services, ElsaClientBuilderOptions? httpClientBuilderOptions = default) where T : class { - var builder = services.AddRefitClient(settings).ConfigureHttpClient(ConfigureElsaApiHttpClient); - builder.AddHttpMessageHandler(); - configureHttpClientBuilder?.Invoke(builder); + var builder = services.AddRefitClient(CreateRefitSettings).ConfigureHttpClient(ConfigureElsaApiHttpClient); + httpClientBuilderOptions?.ConfigureHttpClientBuilder?.Invoke(builder); } /// @@ -98,6 +99,8 @@ public static class DependencyInjectionExtensions { PropertyNamingPolicy = JsonNamingPolicy.CamelCase, }; + + var elsaClientOptions = serviceProvider.GetRequiredService>().Value; serializerOptions.Converters.Add(new JsonStringEnumConverter()); serializerOptions.Converters.Add(new VersionOptionsJsonConverter()); @@ -106,7 +109,7 @@ public static class DependencyInjectionExtensions var settings = new RefitSettings { ContentSerializer = new SystemTextJsonContentSerializer(serializerOptions), - HttpMessageHandlerFactory = serviceProvider.GetRequiredService + HttpMessageHandlerFactory = () => elsaClientOptions.HttpMessageHandlerFactory(serviceProvider) }; return settings; diff --git a/src/clients/Elsa.Api.Client/Options/ElsaClientBuilderOptions.cs b/src/clients/Elsa.Api.Client/Options/ElsaClientBuilderOptions.cs new file mode 100644 index 000000000..ab406a218 --- /dev/null +++ b/src/clients/Elsa.Api.Client/Options/ElsaClientBuilderOptions.cs @@ -0,0 +1,16 @@ +using Microsoft.Extensions.DependencyInjection; + +namespace Elsa.Api.Client.Options; + +/// +/// Represents options for building an Elsa API client. +/// +public class ElsaClientBuilderOptions +{ + /// + /// Gets or sets a delegate that can be used to configure the HTTP client builder. + /// + public Action? ConfigureHttpClientBuilder { get; set; } + + +} \ No newline at end of file diff --git a/src/clients/Elsa.Api.Client/Options/ElsaClientOptions.cs b/src/clients/Elsa.Api.Client/Options/ElsaClientOptions.cs index 6ed518720..afea1c581 100644 --- a/src/clients/Elsa.Api.Client/Options/ElsaClientOptions.cs +++ b/src/clients/Elsa.Api.Client/Options/ElsaClientOptions.cs @@ -1,3 +1,6 @@ +using Elsa.Api.Client.HttpMessageHandlers; +using Microsoft.Extensions.DependencyInjection; + namespace Elsa.Api.Client.Options; /// @@ -19,4 +22,9 @@ public class ElsaClientOptions /// Gets or sets a delegate that can be used to configure the HTTP client. /// public Action? ConfigureHttpClient { get; set; } + + /// + /// Gets or sets a delegate that can be used to configure the HTTP client message handler. + /// + public Func HttpMessageHandlerFactory { get; set; } = sp => sp.GetRequiredService(); } \ No newline at end of file diff --git a/src/clients/Elsa.Api.Client/Services/ElsaClientFactory.cs b/src/clients/Elsa.Api.Client/Services/ElsaClientFactory.cs index 6c1cde6fa..70af8a786 100644 --- a/src/clients/Elsa.Api.Client/Services/ElsaClientFactory.cs +++ b/src/clients/Elsa.Api.Client/Services/ElsaClientFactory.cs @@ -11,7 +11,7 @@ namespace Elsa.Api.Client.Services; public class ElsaClientFactory : IElsaClientFactory { /// - public IElsaClient CreateClient(Action configureOptions, Action? configureHttpClientBuilder = default) + public IElsaClient CreateClient(Action configureOptions, Action? configureHttpClientBuilder = default) { var services = new ServiceCollection().AddElsaClient(configureOptions, configureHttpClientBuilder).BuildServiceProvider(); return services.GetRequiredService();