// Copyright 2022 Valters Melnalksnis // Licensed under the Apache License 2.0. // See LICENSE file in the project root for full license information. using System; using System.Diagnostics.CodeAnalysis; using System.Linq; using System.Net.Http; using System.Net.Http.Headers; using JetBrains.Annotations; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Options; using VMelnalksnis.NordigenDotNet.Accounts; using VMelnalksnis.NordigenDotNet.Agreements; using VMelnalksnis.NordigenDotNet.Institutions; using VMelnalksnis.NordigenDotNet.Requisitions; using VMelnalksnis.NordigenDotNet.Serialization; using VMelnalksnis.NordigenDotNet.Tokens; namespace VMelnalksnis.NordigenDotNet.DependencyInjection; /// Collection of methods for configuring VMelnalksnis.NordigenDotNet in . [PublicAPI] public static class ServiceCollectionExtensions { private static readonly ProductInfoHeaderValue _userAgent; static ServiceCollectionExtensions() { var assemblyName = typeof(INordigenClient).Assembly.GetName(); var assemblyShortName = assemblyName.Name ?? assemblyName.FullName.Split(',').First(); _userAgent = new(assemblyShortName, assemblyName.Version?.ToString()); } /// Adds all required services for , excluding external dependencies. /// The service collection in which to register the services. /// The configuration to which to bind options models. /// The for the used by . #if NET6_0_OR_GREATER [UnconditionalSuppressMessage("ReflectionAnalysis", "IL2026", Justification = $"{nameof(NordigenOptions)} contains only system types.")] #else [SuppressMessage("Trimming", "IL2026", Justification = $"{nameof(NordigenOptions)} contains only system types.")] #endif public static IHttpClientBuilder AddNordigenDotNet( this IServiceCollection serviceCollection, IConfiguration configuration) { serviceCollection .AddOptions() .Bind(configuration.GetSection(NordigenOptions.SectionName)) .ValidateDataAnnotations(); serviceCollection.AddHttpClient(ConfigureNordigenClient); return serviceCollection .AddSingleton() .AddSingleton() .AddTransient() .AddTransient(provider => { var httpClient = provider.GetRequiredService().CreateClient(NordigenOptions.SectionName); var options = provider.GetRequiredService(); return new(httpClient, options); }) .AddTransient(provider => { var httpClient = provider.GetRequiredService().CreateClient(NordigenOptions.SectionName); var options = provider.GetRequiredService(); return new(httpClient, options); }) .AddTransient(provider => { var httpClient = provider.GetRequiredService().CreateClient(NordigenOptions.SectionName); var options = provider.GetRequiredService(); return new(httpClient, options); }) .AddTransient(provider => { var httpClient = provider.GetRequiredService().CreateClient(NordigenOptions.SectionName); var options = provider.GetRequiredService(); return new(httpClient, options); }) .AddTransient(provider => provider.GetRequiredService>().CurrentValue) .AddHttpClient(NordigenOptions.SectionName, ConfigureNordigenClient) .AddHttpMessageHandler(); } private static void ConfigureNordigenClient(IServiceProvider provider, HttpClient client) { client.BaseAddress = provider.GetRequiredService>().CurrentValue.BaseAddress; client.DefaultRequestHeaders.UserAgent.Add(_userAgent); } }