elsa-core/src/clients/Elsa.Api.Client/Extensions/DependencyInjectionExtensions.cs

122 lines
5.4 KiB
C#
Raw Normal View History

2023-06-10 18:32:06 +00:00
using System.Text.Json;
2023-06-19 13:32:26 +00:00
using System.Text.Json.Serialization;
using Elsa.Api.Client.Contracts;
2023-06-19 13:32:26 +00:00
using Elsa.Api.Client.Converters;
2023-08-19 11:37:17 +00:00
using Elsa.Api.Client.HttpMessageHandlers;
using Elsa.Api.Client.Options;
using Elsa.Api.Client.Resources.ActivityDescriptorOptions.Contracts;
using Elsa.Api.Client.Resources.ActivityDescriptors.Contracts;
using Elsa.Api.Client.Resources.ActivityExecutions.Contracts;
using Elsa.Api.Client.Resources.Features.Contracts;
2023-05-19 12:36:16 +00:00
using Elsa.Api.Client.Resources.Identity.Contracts;
using Elsa.Api.Client.Resources.IncidentStrategies.Contracts;
using Elsa.Api.Client.Resources.Scripting.Contracts;
using Elsa.Api.Client.Resources.StorageDrivers.Contracts;
using Elsa.Api.Client.Resources.VariableTypes.Contracts;
2023-07-02 16:59:13 +00:00
using Elsa.Api.Client.Resources.WorkflowActivationStrategies.Contracts;
2023-05-16 18:03:12 +00:00
using Elsa.Api.Client.Resources.WorkflowDefinitions.Contracts;
2023-10-29 10:36:01 +00:00
using Elsa.Api.Client.Resources.WorkflowExecutionContexts.Contracts;
using Elsa.Api.Client.Resources.WorkflowInstances.Contracts;
using Elsa.Api.Client.Services;
2023-04-01 14:15:35 +00:00
using JetBrains.Annotations;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Options;
using Refit;
namespace Elsa.Api.Client.Extensions;
/// <summary>
/// Provides extension methods for dependency injection.
/// </summary>
2023-04-01 14:15:35 +00:00
[PublicAPI]
public static class DependencyInjectionExtensions
{
/// <summary>
/// Adds the Elsa client to the service collection.
/// </summary>
2023-10-26 19:10:07 +00:00
public static IServiceCollection AddElsaClient(this IServiceCollection services, Action<ElsaClientOptions>? configureOptions = default, Action<ElsaClientBuilderOptions>? configureBuilderOptions = default)
{
2023-10-26 19:10:07 +00:00
var builderOptions = new ElsaClientBuilderOptions();
configureBuilderOptions?.Invoke(builderOptions);
2023-08-19 11:37:17 +00:00
services.Configure(configureOptions ?? (_ => { }));
services.AddScoped<ApiHttpMessageHandler>();
2023-07-31 20:37:57 +00:00
services.AddScoped<IElsaClient, ElsaClient>();
2023-06-10 18:32:06 +00:00
2023-10-26 19:10:07 +00:00
services.AddApi<IWorkflowDefinitionsApi>(builderOptions);
services.AddApi<IWorkflowInstancesApi>(builderOptions);
services.AddApi<IActivityDescriptorsApi>(builderOptions);
services.AddApi<IActivityDescriptorOptionsApi>(builderOptions);
2023-10-26 19:10:07 +00:00
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);
2023-10-29 10:36:01 +00:00
services.AddApi<IWorkflowContextProviderDescriptorsApi>(builderOptions);
return services;
}
2023-10-26 19:10:07 +00:00
2023-08-20 18:02:59 +00:00
/// <summary>
/// Adds a refit client for the specified API type.
/// </summary>
/// <param name="services">The service collection.</param>
2023-10-26 19:10:07 +00:00
/// <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
2023-08-20 18:02:59 +00:00
{
2023-10-26 19:10:07 +00:00
var builder = services.AddRefitClient<T>(CreateRefitSettings).ConfigureHttpClient(ConfigureElsaApiHttpClient);
httpClientBuilderOptions?.ConfigureHttpClientBuilder?.Invoke(builder);
2023-08-19 11:37:17 +00:00
}
/// <summary>
/// Creates an API client for the specified API type.
/// </summary>
public static T CreateApi<T>(this IServiceProvider serviceProvider, Uri baseAddress) where T : class
{
return RestService.For<T>(baseAddress.ToString(), CreateRefitSettings(serviceProvider));
}
2023-08-20 18:02:59 +00:00
/// <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(serviceProvider));
}
2023-04-01 14:15:35 +00:00
private static void ConfigureElsaApiHttpClient(IServiceProvider serviceProvider, HttpClient httpClient)
{
var options = serviceProvider.GetRequiredService<IOptions<ElsaClientOptions>>().Value;
httpClient.BaseAddress = options.BaseAddress;
options.ConfigureHttpClient?.Invoke(serviceProvider, httpClient);
}
2023-08-19 11:37:17 +00:00
/// <summary>
/// Creates a <see cref="RefitSettings"/> instance configured for Elsa.
/// </summary>
2023-06-19 13:32:26 +00:00
private static RefitSettings CreateRefitSettings(IServiceProvider serviceProvider)
{
2023-07-04 09:57:01 +00:00
JsonSerializerOptions serializerOptions = new()
2023-06-19 13:32:26 +00:00
{
PropertyNamingPolicy = JsonNamingPolicy.CamelCase,
};
2023-10-26 19:10:07 +00:00
var elsaClientOptions = serviceProvider.GetRequiredService<IOptions<ElsaClientOptions>>().Value;
2023-06-19 13:32:26 +00:00
2023-07-04 09:57:01 +00:00
serializerOptions.Converters.Add(new JsonStringEnumConverter());
serializerOptions.Converters.Add(new VersionOptionsJsonConverter());
serializerOptions.Converters.Add(new ExpressionJsonConverterFactory());
2023-07-09 10:33:26 +00:00
2023-06-19 13:32:26 +00:00
var settings = new RefitSettings
{
2023-08-19 11:37:17 +00:00
ContentSerializer = new SystemTextJsonContentSerializer(serializerOptions),
2023-10-26 19:10:07 +00:00
HttpMessageHandlerFactory = () => elsaClientOptions.HttpMessageHandlerFactory(serviceProvider)
2023-06-19 13:32:26 +00:00
};
return settings;
}
}