using Core.Inventory.External.Clients; using Core.Inventory.External.GatewayConfigurations; using Core.Inventory.External.Helpers; using Microsoft.AspNetCore.Authentication; using Microsoft.AspNetCore.Http; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using Refit; namespace Core.Inventory.External.ClientConfiguration { public static class RegisterClientConfiguration { public static IServiceCollection RegisterExternalLayer(this IServiceCollection services, IConfiguration configuration) { var gatewayConfiguration = new GatewayConfiguration(); var gatewaySettingsConfiguration = new GatewaySettingsConfigurations(configuration); // Register GatewayConfiguration as a singleton services.AddSingleton(gatewayConfiguration); // Register IHttpContextAccessor services.AddSingleton(); // Register ITokenProvider services.AddSingleton(); // Register the custom AuthenticatedHttpClientHandler services.AddTransient(provider => { var tokenProvider = provider.GetRequiredService(); var handler = new AuthenticatedHttpClientHandler(tokenProvider) { InnerHandler = new HttpClientHandler() }; return handler; }); var inventoryServiceApiUrl = GatewaySettingsConfigurations.GetInventoryServiceAPIEndpoint().Endpoint.Url; // Register IInventoryServiceClient with the manually created HttpClient services.AddScoped(provider => { var handler = provider.GetRequiredService(); var httpClient = new HttpClient(handler) { BaseAddress = new Uri(inventoryServiceApiUrl), Timeout = TimeSpan.FromMinutes(1) }; return RestService.For(httpClient); }); services.AddScoped(); return services; } } }