using LittleShop.Client.Configuration; using LittleShop.Client.Http; using LittleShop.Client.Services; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; namespace LittleShop.Client.Extensions; public static class ServiceCollectionExtensions { public static IServiceCollection AddLittleShopClient( this IServiceCollection services, Action? configureOptions = null) { // Configure options if (configureOptions != null) { services.Configure(configureOptions); } else { services.Configure(options => { }); } // Register HTTP handlers services.AddTransient(); services.AddTransient(); // Register main HTTP client services.AddHttpClient((serviceProvider, client) => { var options = serviceProvider.GetRequiredService>().Value; client.BaseAddress = new Uri(options.BaseUrl); client.Timeout = TimeSpan.FromSeconds(options.TimeoutSeconds); client.DefaultRequestHeaders.Add("Accept", "application/json"); }) .AddHttpMessageHandler() .AddHttpMessageHandler(serviceProvider => { var logger = serviceProvider.GetRequiredService>(); var options = serviceProvider.GetRequiredService>().Value; return new RetryPolicyHandler(logger, options.MaxRetryAttempts); }); services.AddHttpClient((serviceProvider, client) => { var options = serviceProvider.GetRequiredService>().Value; client.BaseAddress = new Uri(options.BaseUrl); client.Timeout = TimeSpan.FromSeconds(options.TimeoutSeconds); client.DefaultRequestHeaders.Add("Accept", "application/json"); }) .AddHttpMessageHandler() .AddHttpMessageHandler(serviceProvider => { var logger = serviceProvider.GetRequiredService>(); var options = serviceProvider.GetRequiredService>().Value; return new RetryPolicyHandler(logger, options.MaxRetryAttempts); }); services.AddHttpClient((serviceProvider, client) => { var options = serviceProvider.GetRequiredService>().Value; client.BaseAddress = new Uri(options.BaseUrl); client.Timeout = TimeSpan.FromSeconds(options.TimeoutSeconds); client.DefaultRequestHeaders.Add("Accept", "application/json"); }) .AddHttpMessageHandler() .AddHttpMessageHandler(serviceProvider => { var logger = serviceProvider.GetRequiredService>(); var options = serviceProvider.GetRequiredService>().Value; return new RetryPolicyHandler(logger, options.MaxRetryAttempts); }); // Register the main client services.AddScoped(); return services; } public static IServiceCollection AddLittleShopClient( this IServiceCollection services, string baseUrl) { return services.AddLittleShopClient(options => { options.BaseUrl = baseUrl; }); } }