using FluentValidation; using Managing.Application.Shared.Behaviours; using MediatR; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using System.Reflection; using Managing.Infrastructure.Exchanges; using Managing.Infrastructure.Storage; using Managing.Infrastructure.Databases.MongoDb; using Microsoft.Extensions.Options; using Managing.Application.Trading; using Managing.Infrastructure.Messengers.Discord; using Managing.Infrastructure.Evm; using Discord.WebSocket; using Microsoft.AspNetCore.Hosting; using Discord.Commands; using Managing.Application.Backtesting; using Managing.Application.Scenarios; using Managing.Application.MoneyManagements; using Managing.Application.Accounts; using Managing.Application.Abstractions; using Managing.Application.Shared; using Managing.Infrastructure.Databases; using Managing.Infrastructure.Databases.Abstractions; using Managing.Infrastructure.Databases.InfluxDb.Models; using Managing.Infrastructure.Databases.InfluxDb; using Managing.Application.Abstractions.Repositories; using Managing.Application.Abstractions.Services; using Managing.Infrastructure.Databases.MongoDb.Abstractions; using Managing.Infrastructure.Exchanges.Abstractions; using Managing.Infrastructure.Exchanges.Exchanges; using Managing.Application.Users; using Managing.Infrastructure.Evm.Subgraphs; using Managing.Application.ManageBot.Commands; using Managing.Application.Trading.Commands; using Managing.Domain.Trades; using Managing.Application.Workers.Abstractions; using Managing.Application.Workers; using Binance.Net.Clients; using Binance.Net.Interfaces.Clients; using Managing.Infrastructure.Evm.Services; using Managing.Application.Workflows; using Managing.Application.Bots.Base; using Managing.Application.ManageBot; namespace Managing.Bootstrap; public static class ApiBootstrap { private static readonly Assembly ApplicationAssembly = typeof(StartBotCommand).GetTypeInfo().Assembly; public static IServiceCollection RegisterApiDependencies(this IServiceCollection services, IConfiguration configuration) { return services .AddApplication() .AddInfrastructure(configuration) .AddFluentValidation() .AddMediatR(); } private static IServiceCollection AddApplication(this IServiceCollection services) { services.AddSingleton(); services.AddSingleton(); services.AddSingleton(); services.AddSingleton(); services.AddSingleton(); services.AddSingleton(); services.AddSingleton(); services.AddSingleton(); services.AddSingleton(); services.AddSingleton(); services.AddSingleton(); services.AddTransient, OpenPositionCommandHandler>(); services.AddTransient, ClosePositionCommandHandler>(); return services; } private static IServiceCollection AddInfrastructure(this IServiceCollection services, IConfiguration configuration) { // Database services.AddSingleton(sp => sp.GetRequiredService>().Value); services.AddTransient(typeof(IMongoRepository<>), typeof(MongoRepository<>)); services.AddSingleton(sp => sp.GetRequiredService>().Value); // Evm services.AddGbcFeed(); services.AddUniswapV2(); services.AddChainlink(); services.AddChainlinkGmx(); services.AddSingleton(); // Repositories services.AddTransient(); services.AddTransient(); services.AddTransient(); services.AddTransient(); services.AddTransient(); services.AddTransient(); services.AddTransient(); services.AddTransient(); services.AddTransient(); services.AddTransient(); // Cache services.AddDistributedMemoryCache(); services.AddTransient(); services.AddTransient(); // Processors services.AddTransient(); services.AddTransient(); services.AddTransient(); services.AddTransient(); // Services services.AddTransient(); services.AddTransient(); services.AddTransient(); services.AddSingleton(); services.AddSingleton(); services.AddSingleton(); // Stream services.AddSingleton(); services.AddSingleton(); return services; } private static IServiceCollection AddMediatR(this IServiceCollection services) { return services.AddMediatR(cfg => cfg.RegisterServicesFromAssemblies(AppDomain.CurrentDomain.GetAssemblies())) .AddTransient(typeof(IPipelineBehavior<,>), typeof(ValidationBehaviour<,>)) .AddTransient(typeof(IUnhandledExceptionBehaviour<,>), typeof(UnhandledExceptionBehaviour<,>)); } private static IServiceCollection AddFluentValidation(this IServiceCollection services) { return services.AddValidatorsFromAssembly(ApplicationAssembly); } public static IWebHostBuilder SetupDiscordBot(this IWebHostBuilder builder) { return builder.ConfigureServices(services => { services .AddSingleton() .AddSingleton() .AddSingleton() .AddHostedService(); }); } }