Add message handler provider API
This commit is contained in:
parent
15ca560882
commit
6a66c3f0ae
|
|
@ -1,12 +0,0 @@
|
|||
namespace Elsa.Api.Client.Contracts;
|
||||
|
||||
/// <summary>
|
||||
/// An interface for classes that can configure an HTTP request made to the API.
|
||||
/// </summary>
|
||||
public interface IApiHttpRequestConfigurator
|
||||
{
|
||||
/// <summary>
|
||||
/// Configures the HTTP request.
|
||||
/// </summary>
|
||||
Task ConfigureRequestAsync(HttpRequestMessage request, CancellationToken cancellationToken);
|
||||
}
|
||||
|
|
@ -0,0 +1,12 @@
|
|||
namespace Elsa.Api.Client.Contracts;
|
||||
|
||||
/// <summary>
|
||||
/// Provides an <see cref="HttpMessageHandler"/> instance.
|
||||
/// </summary>
|
||||
public interface IHttpMessageHandlerProvider
|
||||
{
|
||||
/// <summary>
|
||||
/// Returns an <see cref="HttpMessageHandler"/> instance.
|
||||
/// </summary>
|
||||
HttpMessageHandler GetHandler();
|
||||
}
|
||||
|
|
@ -31,23 +31,31 @@ public static class DependencyInjectionExtensions
|
|||
/// Adds the Elsa client to the service collection.
|
||||
/// </summary>
|
||||
public static IServiceCollection AddElsaClient(this IServiceCollection services, Action<ElsaClientOptions>? configureOptions = default)
|
||||
{
|
||||
return services.AddElsaClient(builder => builder.AddHttpMessageHandler<ApiHttpMessageHandler>() , configureOptions);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Adds the Elsa client to the service collection.
|
||||
/// </summary>
|
||||
public static IServiceCollection AddElsaClient(this IServiceCollection services, Action<IHttpClientBuilder> configureHttpClientBuilder, Action<ElsaClientOptions>? configureOptions = default)
|
||||
{
|
||||
services.Configure(configureOptions ?? (_ => { }));
|
||||
services.AddScoped<ApiHttpMessageHandler>();
|
||||
services.AddScoped<IElsaClient, ElsaClient>();
|
||||
|
||||
services.AddApi<IWorkflowDefinitionsApi>(CreateRefitSettings);
|
||||
services.AddApi<IWorkflowInstancesApi>(CreateRefitSettings);
|
||||
services.AddApi<IActivityDescriptorsApi>(CreateRefitSettings);
|
||||
services.AddApi<IActivityExecutionsApi>(CreateRefitSettings);
|
||||
services.AddApi<IStorageDriversApi>(CreateRefitSettings);
|
||||
services.AddApi<IVariableTypesApi>(CreateRefitSettings);
|
||||
services.AddApi<IWorkflowActivationStrategiesApi>(CreateRefitSettings);
|
||||
services.AddApi<ILoginApi>(CreateRefitSettings);
|
||||
services.AddApi<IFeaturesApi>(CreateRefitSettings);
|
||||
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<ILoginApi>(CreateRefitSettings, configureHttpClientBuilder);
|
||||
services.AddApi<IFeaturesApi>(CreateRefitSettings, configureHttpClientBuilder);
|
||||
return services;
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// Adds a refit client for the specified API type.
|
||||
/// </summary>
|
||||
|
|
@ -56,9 +64,20 @@ public static class DependencyInjectionExtensions
|
|||
/// <typeparam name="T">The API type.</typeparam>
|
||||
public static void AddApi<T>(this IServiceCollection services, Func<IServiceProvider, RefitSettings> settings) where T : class
|
||||
{
|
||||
services.AddRefitClient<T>(settings)
|
||||
.ConfigureHttpClient(ConfigureElsaApiHttpClient)
|
||||
.AddHttpMessageHandler<ApiHttpMessageHandler>();
|
||||
services.AddApi<T>(settings, builder => builder.AddHttpMessageHandler<ApiHttpMessageHandler>());
|
||||
}
|
||||
|
||||
/// <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) where T : class
|
||||
{
|
||||
var builder = services.AddRefitClient<T>(settings).ConfigureHttpClient(ConfigureElsaApiHttpClient);
|
||||
configureHttpClientBuilder(builder);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
|
|
@ -68,6 +87,14 @@ public static class DependencyInjectionExtensions
|
|||
{
|
||||
return RestService.For<T>(baseAddress.ToString(), CreateRefitSettings(serviceProvider));
|
||||
}
|
||||
|
||||
/// <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));
|
||||
}
|
||||
|
||||
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<ApiHttpMessageHandler>
|
||||
};
|
||||
|
||||
return settings;
|
||||
|
|
|
|||
|
|
@ -1,28 +1,19 @@
|
|||
using Elsa.Api.Client.Contracts;
|
||||
using Microsoft.Extensions.DependencyInjection;
|
||||
|
||||
namespace Elsa.Api.Client.HttpMessageHandlers;
|
||||
|
||||
/// <summary>
|
||||
/// An HTTP message handler that invokes <see cref="IApiHttpRequestConfigurator"/> instances before sending the request.
|
||||
/// An HTTP message handler that delegates its processing to another <see cref="HttpMessageHandler"/> instance provided by an <see cref="IHttpMessageHandlerProvider"/>.
|
||||
/// </summary>
|
||||
public class ApiHttpMessageHandler : DelegatingHandler
|
||||
{
|
||||
private readonly IEnumerable<IApiHttpRequestConfigurator> _httpClientConfigurators;
|
||||
|
||||
/// <inheritdoc />
|
||||
public ApiHttpMessageHandler(IEnumerable<IApiHttpRequestConfigurator> httpClientConfigurators)
|
||||
public ApiHttpMessageHandler(IServiceProvider serviceProvider)
|
||||
{
|
||||
_httpClientConfigurators = httpClientConfigurators;
|
||||
}
|
||||
var provider = serviceProvider.GetService<IHttpMessageHandlerProvider>();
|
||||
|
||||
/// <inheritdoc />
|
||||
protected override async Task<HttpResponseMessage> 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();
|
||||
}
|
||||
}
|
||||
Loading…
Reference in a new issue