Expose HTTP Message Handler factory
This commit is contained in:
parent
eb93b3406f
commit
de4cf34c47
|
|
@ -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
|
|||
/// <summary>
|
||||
/// Creates a new <see cref="IElsaClient"/> instance.
|
||||
/// </summary>
|
||||
IElsaClient CreateClient(Action<ElsaClientOptions> configureOptions, Action<IHttpClientBuilder>? configureHttpClientBuilder = default);
|
||||
IElsaClient CreateClient(Action<ElsaClientOptions> configureOptions, Action<ElsaClientBuilderOptions>? configureHttpClientBuilder = default);
|
||||
}
|
||||
|
|
@ -32,38 +32,39 @@ public static class DependencyInjectionExtensions
|
|||
/// <summary>
|
||||
/// Adds the Elsa client to the service collection.
|
||||
/// </summary>
|
||||
public static IServiceCollection AddElsaClient(this IServiceCollection services, Action<ElsaClientOptions>? configureOptions = default, Action<IHttpClientBuilder>? configureHttpClientBuilder = default)
|
||||
public static IServiceCollection AddElsaClient(this IServiceCollection services, Action<ElsaClientOptions>? configureOptions = default, Action<ElsaClientBuilderOptions>? configureBuilderOptions = default)
|
||||
{
|
||||
var builderOptions = new ElsaClientBuilderOptions();
|
||||
configureBuilderOptions?.Invoke(builderOptions);
|
||||
|
||||
services.Configure(configureOptions ?? (_ => { }));
|
||||
services.AddScoped<ApiHttpMessageHandler>();
|
||||
services.AddScoped<IElsaClient, ElsaClient>();
|
||||
|
||||
services.AddApi<IWorkflowDefinitionsApi>(CreateRefitSettings, configureHttpClientBuilder);
|
||||
services.AddApi<IWorkflowInstancesApi>(CreateRefitSettings, configureHttpClientBuilder);
|
||||
services.AddApi<IActivityDescriptorsApi>(CreateRefitSettings, configureHttpClientBuilder);
|
||||
services.AddApi<IActivityExecutionsApi>(CreateRefitSettings, configureHttpClientBuilder);
|
||||
services.AddApi<IStorageDriversApi>(CreateRefitSettings, configureHttpClientBuilder);
|
||||
services.AddApi<IVariableTypesApi>(CreateRefitSettings, configureHttpClientBuilder);
|
||||
services.AddApi<IWorkflowActivationStrategiesApi>(CreateRefitSettings, configureHttpClientBuilder);
|
||||
services.AddApi<IIncidentStrategiesApi>(CreateRefitSettings, configureHttpClientBuilder);
|
||||
services.AddApi<ILoginApi>(CreateRefitSettings, configureHttpClientBuilder);
|
||||
services.AddApi<IFeaturesApi>(CreateRefitSettings, configureHttpClientBuilder);
|
||||
services.AddApi<IJavaScriptApi>(CreateRefitSettings, configureHttpClientBuilder);
|
||||
services.AddApi<IWorkflowDefinitionsApi>(builderOptions);
|
||||
services.AddApi<IWorkflowInstancesApi>(builderOptions);
|
||||
services.AddApi<IActivityDescriptorsApi>(builderOptions);
|
||||
services.AddApi<IActivityExecutionsApi>(builderOptions);
|
||||
services.AddApi<IStorageDriversApi>(builderOptions);
|
||||
services.AddApi<IVariableTypesApi>(builderOptions);
|
||||
services.AddApi<IWorkflowActivationStrategiesApi>(builderOptions);
|
||||
services.AddApi<IIncidentStrategiesApi>(builderOptions);
|
||||
services.AddApi<ILoginApi>(builderOptions);
|
||||
services.AddApi<IFeaturesApi>(builderOptions);
|
||||
services.AddApi<IJavaScriptApi>(builderOptions);
|
||||
return services;
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// Adds a refit client for the specified API type.
|
||||
/// </summary>
|
||||
/// <param name="services">The service collection.</param>
|
||||
/// <param name="settings">The refit settings.</param>
|
||||
/// <param name="configureHttpClientBuilder">A delegate to configure the HTTP client builder.</param>
|
||||
/// <typeparam name="T">The API type.</typeparam>
|
||||
public static void AddApi<T>(this IServiceCollection services, Func<IServiceProvider, RefitSettings> settings, Action<IHttpClientBuilder>? configureHttpClientBuilder = default) where T : class
|
||||
/// <param name="httpClientBuilderOptions">An options object that can be used to configure the HTTP client builder.</param>
|
||||
/// <typeparam name="T">The type representing the API.</typeparam>
|
||||
public static void AddApi<T>(this IServiceCollection services, ElsaClientBuilderOptions? httpClientBuilderOptions = default) where T : class
|
||||
{
|
||||
var builder = services.AddRefitClient<T>(settings).ConfigureHttpClient(ConfigureElsaApiHttpClient);
|
||||
builder.AddHttpMessageHandler<ApiHttpMessageHandler>();
|
||||
configureHttpClientBuilder?.Invoke(builder);
|
||||
var builder = services.AddRefitClient<T>(CreateRefitSettings).ConfigureHttpClient(ConfigureElsaApiHttpClient);
|
||||
httpClientBuilderOptions?.ConfigureHttpClientBuilder?.Invoke(builder);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
|
|
@ -98,6 +99,8 @@ public static class DependencyInjectionExtensions
|
|||
{
|
||||
PropertyNamingPolicy = JsonNamingPolicy.CamelCase,
|
||||
};
|
||||
|
||||
var elsaClientOptions = serviceProvider.GetRequiredService<IOptions<ElsaClientOptions>>().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<ApiHttpMessageHandler>
|
||||
HttpMessageHandlerFactory = () => elsaClientOptions.HttpMessageHandlerFactory(serviceProvider)
|
||||
};
|
||||
|
||||
return settings;
|
||||
|
|
|
|||
|
|
@ -0,0 +1,16 @@
|
|||
using Microsoft.Extensions.DependencyInjection;
|
||||
|
||||
namespace Elsa.Api.Client.Options;
|
||||
|
||||
/// <summary>
|
||||
/// Represents options for building an Elsa API client.
|
||||
/// </summary>
|
||||
public class ElsaClientBuilderOptions
|
||||
{
|
||||
/// <summary>
|
||||
/// Gets or sets a delegate that can be used to configure the HTTP client builder.
|
||||
/// </summary>
|
||||
public Action<IHttpClientBuilder>? ConfigureHttpClientBuilder { get; set; }
|
||||
|
||||
|
||||
}
|
||||
|
|
@ -1,3 +1,6 @@
|
|||
using Elsa.Api.Client.HttpMessageHandlers;
|
||||
using Microsoft.Extensions.DependencyInjection;
|
||||
|
||||
namespace Elsa.Api.Client.Options;
|
||||
|
||||
/// <summary>
|
||||
|
|
@ -19,4 +22,9 @@ public class ElsaClientOptions
|
|||
/// Gets or sets a delegate that can be used to configure the HTTP client.
|
||||
/// </summary>
|
||||
public Action<IServiceProvider, HttpClient>? ConfigureHttpClient { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Gets or sets a delegate that can be used to configure the HTTP client message handler.
|
||||
/// </summary>
|
||||
public Func<IServiceProvider, HttpMessageHandler> HttpMessageHandlerFactory { get; set; } = sp => sp.GetRequiredService<ApiHttpMessageHandler>();
|
||||
}
|
||||
|
|
@ -11,7 +11,7 @@ namespace Elsa.Api.Client.Services;
|
|||
public class ElsaClientFactory : IElsaClientFactory
|
||||
{
|
||||
/// <inheritdoc />
|
||||
public IElsaClient CreateClient(Action<ElsaClientOptions> configureOptions, Action<IHttpClientBuilder>? configureHttpClientBuilder = default)
|
||||
public IElsaClient CreateClient(Action<ElsaClientOptions> configureOptions, Action<ElsaClientBuilderOptions>? configureHttpClientBuilder = default)
|
||||
{
|
||||
var services = new ServiceCollection().AddElsaClient(configureOptions, configureHttpClientBuilder).BuildServiceProvider();
|
||||
return services.GetRequiredService<IElsaClient>();
|
||||
|
|
|
|||
Loading…
Reference in a new issue