// 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.DependencyInjection.Extensions; using Microsoft.Extensions.Options; using NodaTime; using VMelnalksnis.NordigenDotNet.Accounts; using VMelnalksnis.NordigenDotNet.Agreements; using VMelnalksnis.NordigenDotNet.Institutions; using VMelnalksnis.NordigenDotNet.Requisitions; 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 . /// The service collection in which to register the services. /// The configuration to which to bind options models. /// Clock for accessing the current time. /// Time zone provider for date and time serialization. /// The for the used by . public static IHttpClientBuilder AddNordigenDotNet( this IServiceCollection serviceCollection, IConfiguration configuration, IClock clock, IDateTimeZoneProvider dateTimeZoneProvider) { serviceCollection.TryAddSingleton(clock); serviceCollection.TryAddSingleton(dateTimeZoneProvider); return serviceCollection.AddNordigenDotNet(configuration); } /// 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 . [UnconditionalSuppressMessage("ReflectionAnalysis", "IL2026", Justification = $"{nameof(NordigenOptions)} contains only system types.")] 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() .AddTransient() .AddTransient() .AddTransient() .AddTransient(provider => provider.GetRequiredService>().CurrentValue) .AddHttpClient(ConfigureNordigenClient) .AddHttpMessageHandler(); } private static void ConfigureNordigenClient(IServiceProvider provider, HttpClient client) { client.BaseAddress = provider.GetRequiredService>().CurrentValue.BaseAddress; client.DefaultRequestHeaders.UserAgent.Add(_userAgent); } }