Catalog/Catalog.Communication/DependencyInjection/CatalogCommunicationServiceCollectionExtensions.cs

46 lines
2 KiB
C#

using System.Net;
using Catalog.Communication.Abstractions;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.DependencyInjection.Extensions;
using Microsoft.Extensions.Options;
namespace Catalog.Communication.DependencyInjection;
public static class CatalogCommunicationServiceCollectionExtensions
{
public static IServiceCollection AddCatalogCommunication(this IServiceCollection services, Action<CatalogCommunicationOptions> configure)
{
ArgumentNullException.ThrowIfNull(services);
ArgumentNullException.ThrowIfNull(configure);
services
.AddOptions<CatalogCommunicationOptions>()
.Configure(configure)
.Validate(o => o.BaseUri is not null, "CatalogCommunicationOptions.BaseUri is required.")
.Validate(o => !string.IsNullOrWhiteSpace(o.AdminPageBasePath), "AdminPageBasePath is required.")
.Validate(o => o.RequestTimeout > TimeSpan.Zero, "RequestTimeout must be greater than zero.")
.Validate(o => o.RetryCount >= 0 && o.RetryCount <= 10, "RetryCount must be between 0 and 10.")
.Validate(o => o.RetryBaseDelay > TimeSpan.Zero, "RetryBaseDelay must be greater than zero.");
services.TryAddSingleton<CookieContainer>();
services
.AddHttpClient<IRaceUploadCommunicationClient, RaceUploadCommunicationClient>((sp, client) =>
{
var options = sp.GetRequiredService<IOptions<CatalogCommunicationOptions>>().Value;
client.BaseAddress = options.BaseUri;
})
.ConfigurePrimaryHttpMessageHandler(sp =>
{
var cookieContainer = sp.GetRequiredService<CookieContainer>();
return new HttpClientHandler
{
UseCookies = true,
CookieContainer = cookieContainer,
AutomaticDecompression = DecompressionMethods.GZip | DecompressionMethods.Deflate | DecompressionMethods.Brotli,
};
});
return services;
}
}