using Core.Cerberos.External.Clients; using Core.Cerberos.External.GatewayConfigurations; using Core.Cerberos.External.Helpers.Token; using Lib.Architecture.BuildingBlocks; using Microsoft.AspNetCore.Authentication; using Microsoft.AspNetCore.Http; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using Refit; namespace Core.Cerberos.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() // Setting the InnerHandler manually }; return handler; }); var cerberosServiceApiUrl = GatewaySettingsConfigurations.GetCerberosServiceAPIEndpoint().Endpoint.Url; // Register ICerberosServiceClient with the manually created HttpClient services.AddScoped(provider => { var handler = provider.GetRequiredService(); var httpClient = new HttpClient(handler) { BaseAddress = new Uri(cerberosServiceApiUrl), Timeout = TimeSpan.FromMinutes(1) }; return RestService.For(httpClient); }); services.AddScoped(); return services; } } }