Refactor API client DI methods for cleaner configuration
Refactor `AddElsaApiKeyClient`, `AddElsaClient`, and related methods to improve readability and maintainability. Introduced `AddDefaultApiClientsUsingApiKey`, `AddDefaultApiClients`, and `AddApiClients` for a more structured approach, consolidating redundant code and ensuring better configurability.
This commit is contained in:
parent
7e29472b87
commit
1c068373fd
|
|
@ -20,21 +20,17 @@ using static Elsa.Api.Client.RefitSettingsHelper;
|
|||
|
||||
namespace Elsa.Api.Client.Extensions;
|
||||
|
||||
/// <summary>
|
||||
/// Provides extension methods for dependency injection.
|
||||
/// </summary>
|
||||
[PublicAPI]
|
||||
public static class DependencyInjectionExtensions
|
||||
{
|
||||
/// <summary>
|
||||
/// Adds the Elsa API client configured to use an API key to the service collection.
|
||||
/// </summary>
|
||||
public static IServiceCollection AddElsaApiKeyClient(this IServiceCollection services, Action<ElsaClientOptions> configureOptions)
|
||||
/// Adds default Elsa API clients configured to use an API key.
|
||||
public static IServiceCollection AddDefaultApiClientsUsingApiKey(this IServiceCollection services, Action<ElsaClientOptions> configureOptions)
|
||||
{
|
||||
var options = new ElsaClientOptions();
|
||||
configureOptions(options);
|
||||
|
||||
return services.AddElsaClient(client =>
|
||||
return services.AddDefaultApiClients(client =>
|
||||
{
|
||||
client.BaseAddress = options.BaseAddress;
|
||||
client.ApiKey = options.ApiKey;
|
||||
|
|
@ -42,49 +38,70 @@ public static class DependencyInjectionExtensions
|
|||
});
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Adds the Elsa client to the service collection.
|
||||
/// </summary>
|
||||
public static IServiceCollection AddElsaClient(this IServiceCollection services, Action<ElsaClientBuilderOptions> configureClient)
|
||||
/// Adds default Elsa API clients.
|
||||
public static IServiceCollection AddDefaultApiClients(this IServiceCollection services, Action<ElsaClientBuilderOptions> configureClient)
|
||||
{
|
||||
var builderOptions = new ElsaClientBuilderOptions();
|
||||
configureClient.Invoke(builderOptions);
|
||||
builderOptions.ConfigureHttpClientBuilder += builder => builder.AddHttpMessageHandler(sp => (DelegatingHandler)sp.GetRequiredService(builderOptions.AuthenticationHandler));
|
||||
|
||||
services.AddScoped(builderOptions.AuthenticationHandler);
|
||||
|
||||
services.Configure<ElsaClientOptions>(options =>
|
||||
return services.AddApiClients(configureClient, builderOptions =>
|
||||
{
|
||||
options.BaseAddress = builderOptions.BaseAddress;
|
||||
options.ConfigureHttpClient = builderOptions.ConfigureHttpClient;
|
||||
options.ApiKey = builderOptions.ApiKey;
|
||||
var builderOptionsWithoutRetryPolicy = new ElsaClientBuilderOptions
|
||||
{
|
||||
ApiKey = builderOptions.ApiKey,
|
||||
AuthenticationHandler = builderOptions.AuthenticationHandler,
|
||||
BaseAddress = builderOptions.BaseAddress,
|
||||
ConfigureHttpClient = builderOptions.ConfigureHttpClient,
|
||||
ConfigureHttpClientBuilder = builderOptions.ConfigureHttpClientBuilder,
|
||||
ConfigureRetryPolicy = null
|
||||
};
|
||||
|
||||
services.AddApi<IWorkflowDefinitionsApi>(builderOptions);
|
||||
services.AddApi<IExecuteWorkflowApi>(builderOptionsWithoutRetryPolicy);
|
||||
services.AddApi<IWorkflowInstancesApi>(builderOptions);
|
||||
services.AddApi<IActivityDescriptorsApi>(builderOptions);
|
||||
services.AddApi<IActivityDescriptorOptionsApi>(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);
|
||||
services.AddApi<IExpressionDescriptorsApi>(builderOptions);
|
||||
services.AddApi<IWorkflowContextProviderDescriptorsApi>(builderOptions);
|
||||
});
|
||||
}
|
||||
|
||||
var builderOptionsWithoutRetryPolicy = new ElsaClientBuilderOptions
|
||||
/// <summary>
|
||||
/// Adds an API client to the service collection. Requires AddElsaClient to be called exactly once.
|
||||
/// </summary>
|
||||
public static IServiceCollection AddApiClient<T>(this IServiceCollection services, Action<ElsaClientBuilderOptions> configureClient) where T : class
|
||||
{
|
||||
return services.AddApiClients(configureClient, builderOptions => services.AddApi<T>(builderOptions));
|
||||
}
|
||||
|
||||
/// Adds the Elsa client to the service collection.
|
||||
public static IServiceCollection AddApiClients(this IServiceCollection services, Action<ElsaClientBuilderOptions> configureClient, Action<ElsaClientBuilderOptions>? configureServices)
|
||||
{
|
||||
var builderOptionsServiceDescriptor = services.FirstOrDefault(x => x.ServiceType == typeof(ElsaClientBuilderOptions));
|
||||
|
||||
if (builderOptionsServiceDescriptor == null)
|
||||
{
|
||||
ApiKey = builderOptions.ApiKey,
|
||||
AuthenticationHandler = builderOptions.AuthenticationHandler,
|
||||
BaseAddress = builderOptions.BaseAddress,
|
||||
ConfigureHttpClient = builderOptions.ConfigureHttpClient,
|
||||
ConfigureHttpClientBuilder = builderOptions.ConfigureHttpClientBuilder,
|
||||
ConfigureRetryPolicy = null
|
||||
};
|
||||
var builderOptions = new ElsaClientBuilderOptions();
|
||||
configureClient.Invoke(builderOptions);
|
||||
builderOptions.ConfigureHttpClientBuilder += builder => builder.AddHttpMessageHandler(sp => (DelegatingHandler)sp.GetRequiredService(builderOptions.AuthenticationHandler));
|
||||
|
||||
services.AddScoped(builderOptions.AuthenticationHandler);
|
||||
|
||||
services.Configure<ElsaClientOptions>(options =>
|
||||
{
|
||||
options.BaseAddress = builderOptions.BaseAddress;
|
||||
options.ConfigureHttpClient = builderOptions.ConfigureHttpClient;
|
||||
options.ApiKey = builderOptions.ApiKey;
|
||||
});
|
||||
|
||||
configureServices?.Invoke(builderOptions);
|
||||
}
|
||||
|
||||
services.AddApi<IWorkflowDefinitionsApi>(builderOptions);
|
||||
services.AddApi<IExecuteWorkflowApi>(builderOptionsWithoutRetryPolicy);
|
||||
services.AddApi<IWorkflowInstancesApi>(builderOptions);
|
||||
services.AddApi<IActivityDescriptorsApi>(builderOptions);
|
||||
services.AddApi<IActivityDescriptorOptionsApi>(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);
|
||||
services.AddApi<IExpressionDescriptorsApi>(builderOptions);
|
||||
services.AddApi<IWorkflowContextProviderDescriptorsApi>(builderOptions);
|
||||
return services;
|
||||
}
|
||||
|
||||
|
|
@ -94,11 +111,23 @@ public static class DependencyInjectionExtensions
|
|||
/// <param name="services">The service collection.</param>
|
||||
/// <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
|
||||
public static IServiceCollection AddApi<T>(this IServiceCollection services, ElsaClientBuilderOptions? httpClientBuilderOptions = default) where T : class
|
||||
{
|
||||
var builder = services.AddRefitClient<T>(_ => CreateRefitSettings(), typeof(T).Name).ConfigureHttpClient(ConfigureElsaApiHttpClient);
|
||||
return services.AddApi(typeof(T), httpClientBuilderOptions);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Adds a refit client for the specified API type.
|
||||
/// </summary>
|
||||
/// <param name="services">The service collection.</param>
|
||||
/// <param name="apiType">The type representing the API</param>
|
||||
/// <param name="httpClientBuilderOptions">An options object that can be used to configure the HTTP client builder.</param>
|
||||
public static IServiceCollection AddApi(this IServiceCollection services, Type apiType, ElsaClientBuilderOptions? httpClientBuilderOptions = default)
|
||||
{
|
||||
var builder = services.AddRefitClient(apiType, _ => CreateRefitSettings(), apiType.Name).ConfigureHttpClient(ConfigureElsaApiHttpClient);
|
||||
httpClientBuilderOptions?.ConfigureHttpClientBuilder(builder);
|
||||
httpClientBuilderOptions?.ConfigureRetryPolicy?.Invoke(builder);
|
||||
return services;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
|
|
@ -115,9 +144,7 @@ public static class DependencyInjectionExtensions
|
|||
httpClientBuilderOptions?.ConfigureHttpClientBuilder(builder);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Creates an API client for the specified API type.
|
||||
/// </summary>
|
||||
public static T CreateApi<T>(this IServiceProvider serviceProvider, Uri baseAddress) where T : class
|
||||
{
|
||||
var httpClientFactory = serviceProvider.GetRequiredService<IHttpClientFactory>();
|
||||
|
|
@ -126,9 +153,7 @@ public static class DependencyInjectionExtensions
|
|||
return CreateApi<T>(serviceProvider, httpClient);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Creates an API client for the specified API type.
|
||||
/// </summary>
|
||||
public static T CreateApi<T>(this IServiceProvider serviceProvider, HttpClient httpClient) where T : class
|
||||
{
|
||||
return RestService.For<T>(httpClient, CreateRefitSettings());
|
||||
|
|
|
|||
Loading…
Reference in a new issue