using System.IO.Abstractions; using System.Net; using System.Reflection; using Microsoft.AspNetCore.Authorization; using Microsoft.Extensions.DependencyInjection; using Polly; using Polly.Extensions.Http; using RdtClient.Service.BackgroundServices; using RdtClient.Service.Middleware; using RdtClient.Service.Services; using RdtClient.Service.Services.TorrentClients; using RdtClient.Service.Wrappers; namespace RdtClient.Service; public static class DiConfig { public const String RD_CLIENT = "RdClient"; public static readonly String UserAgent = $"rdt-client {Assembly.GetEntryAssembly()?.GetName().Version}"; public static void RegisterRdtServices(this IServiceCollection services) { services.AddMemoryCache(); services.AddSingleton(); services.AddScoped(); services.AddSingleton(); services.AddSingleton(); services.AddScoped(); services.AddScoped(); services.AddScoped(); services.AddScoped(); services.AddScoped(); services.AddScoped(); services.AddScoped(); services.AddScoped(); services.AddScoped(); services.AddScoped(); services.AddScoped(); services.AddScoped(); services.AddSingleton(); services.AddSingleton(); services.AddSingleton(); services.AddSingleton(); services.AddHostedService(); services.AddHostedService(); services.AddHostedService(); services.AddHostedService(); services.AddHostedService(); services.AddHostedService(); services.AddHostedService(); } public static void RegisterHttpClients(this IServiceCollection services) { var retryPolicy = HttpPolicyExtensions .HandleTransientHttpError() .OrResult(r => r.StatusCode == HttpStatusCode.TooManyRequests) .WaitAndRetryAsync(5, attempt => TimeSpan.FromSeconds(Math.Pow(2, attempt))); services.AddHttpClient(); services.ConfigureHttpClientDefaults(builder => { builder.ConfigureHttpClient(httpClient => { httpClient.DefaultRequestHeaders.Add("User-Agent", UserAgent); }); }); services.AddHttpClient(RD_CLIENT) .AddPolicyHandler(retryPolicy); } }