Files
managing-apps/src/Managing.Bootstrap/ComputeBootstrap.cs
2025-11-09 02:08:31 +07:00

171 lines
8.3 KiB
C#

using Managing.Application.Abstractions;
using Managing.Application.Abstractions.Repositories;
using Managing.Application.Abstractions.Services;
using Managing.Application.Accounts;
using Managing.Application.Backtests;
using Managing.Application.MoneyManagements;
using Managing.Application.Scenarios;
using Managing.Application.Shared;
using Managing.Application.Synth;
using Managing.Application.Trading;
using Managing.Application.Users;
using Managing.Application.Whitelist;
using Managing.Domain.Statistics;
using Managing.Domain.Trades;
using Managing.Infrastructure.Databases;
using Managing.Infrastructure.Databases.InfluxDb;
using Managing.Infrastructure.Databases.InfluxDb.Abstractions;
using Managing.Infrastructure.Databases.InfluxDb.Models;
using Managing.Infrastructure.Databases.PostgreSql;
using Managing.Infrastructure.Databases.PostgreSql.Configurations;
using Managing.Infrastructure.Evm;
using Managing.Infrastructure.Evm.Services;
using Managing.Infrastructure.Evm.Subgraphs;
using Managing.Infrastructure.Exchanges;
using Managing.Infrastructure.Exchanges.Abstractions;
using Managing.Infrastructure.Exchanges.Exchanges;
using Managing.Infrastructure.Storage;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Options;
using static Managing.Common.Enums;
namespace Managing.Bootstrap;
/// <summary>
/// Bootstrap configuration for compute worker project (no Orleans)
/// </summary>
public static class ComputeBootstrap
{
public static IServiceCollection RegisterComputeDependencies(this IServiceCollection services,
IConfiguration configuration)
{
return services
.AddApplication()
.AddInfrastructure(configuration);
}
private static IServiceCollection AddApplication(this IServiceCollection services)
{
// Core services needed for backtest execution
services.AddScoped<ITradingService, TradingService>();
services.AddScoped<IScenarioService, ScenarioService>();
services.AddScoped<IMoneyManagementService, MoneyManagementService>();
services.AddScoped<IAccountService, AccountService>();
services.AddScoped<IUserService, UserService>();
// Services not needed for compute worker (depend on IBacktester/Orleans)
// services.AddScoped<IStatisticService, StatisticService>(); // Requires IBacktester
// services.AddScoped<ISettingsService, SettingsService>(); // Requires IBacktester
// services.AddScoped<IGeneticService, GeneticService>(); // Requires IBacktester
// services.AddScoped<IAgentService, AgentService>(); // May require Orleans
// services.AddScoped<IBotService, BotService>(); // May require Orleans
// services.AddScoped<IWorkerService, WorkerService>(); // May require Orleans
// services.AddScoped<IPricesService, PricesService>(); // May require Orleans
// Processors
// Note: IBacktester not needed for compute worker - BacktestExecutor is used directly
services.AddTransient<BacktestExecutor>();
services.AddTransient<IExchangeProcessor, EvmProcessor>();
services.AddTransient<ITradaoService, TradaoService>();
services.AddTransient<IExchangeService, ExchangeService>();
// Web3Proxy service (needed for EvmManager)
services.AddTransient<IWeb3ProxyService, Web3ProxyService>();
// Evm services (needed for ExchangeService)
services.AddGbcFeed();
services.AddUniswapV2();
services.AddChainlink();
services.AddChainlinkGmx();
services.AddSingleton<IEvmManager, EvmManager>();
services.AddTransient<IKaigenService, KaigenService>();
services.AddTransient<IWhitelistService, WhitelistService>();
// Synth services (needed for TradingService)
services.AddScoped<ISynthPredictionService, SynthPredictionService>();
services.AddScoped<ISynthApiClient, SynthApiClient>();
// No-op implementations for compute worker (no Discord needed)
services.AddSingleton<IDiscordService, NoOpDiscordService>();
// IGrainFactory is optional in UserService - register as null for compute workers
services.AddSingleton<IGrainFactory>(sp => null!);
// Webhook service (required for notifications)
services.AddHttpClient<IWebhookService, WebhookService>();
// MessengerService must be Scoped because it depends on IUserService which is Scoped
services.AddScoped<IMessengerService, MessengerService>();
return services;
}
private static IServiceCollection AddInfrastructure(this IServiceCollection services, IConfiguration configuration)
{
// Database
services.AddSingleton<IPostgreSqlSettings>(sp =>
sp.GetRequiredService<IOptions<PostgreSqlSettings>>().Value);
services.AddSingleton<IInfluxDbSettings>(sp =>
sp.GetRequiredService<IOptions<InfluxDbSettings>>().Value);
services.Configure<KaigenSettings>(configuration.GetSection("Kaigen"));
services.Configure<Web3ProxySettings>(configuration.GetSection("Web3Proxy"));
// SQL Monitoring (required by repositories)
services.Configure<SqlMonitoringSettings>(configuration.GetSection("SqlMonitoring"));
services.AddSingleton<SentrySqlMonitoringService>();
// PostgreSql Repositories
services.AddTransient<IAccountRepository, PostgreSqlAccountRepository>();
services.AddTransient<IBacktestRepository, PostgreSqlBacktestRepository>();
services.AddTransient<IBacktestJobRepository, PostgreSqlJobRepository>();
services.AddTransient<IGeneticRepository, PostgreSqlGeneticRepository>();
services.AddTransient<ITradingRepository, PostgreSqlTradingRepository>();
services.AddTransient<ISettingsRepository, PostgreSqlSettingsRepository>();
services.AddTransient<IUserRepository, PostgreSqlUserRepository>();
services.AddTransient<IAgentSummaryRepository, AgentSummaryRepository>();
services.AddTransient<IStatisticRepository, PostgreSqlStatisticRepository>();
services.AddTransient<IBotRepository, PostgreSqlBotRepository>();
services.AddTransient<IWorkerRepository, PostgreSqlWorkerRepository>();
services.AddTransient<ISynthRepository, PostgreSqlSynthRepository>();
services.AddTransient<IWhitelistRepository, PostgreSqlWhitelistRepository>();
// InfluxDb Repositories
services.AddSingleton<IInfluxDbRepository, InfluxDbRepository>();
services.AddSingleton<ICandleRepository, CandleRepository>();
services.AddSingleton<IAgentBalanceRepository, AgentBalanceRepository>();
// Cache
services.AddDistributedMemoryCache();
services.AddTransient<ICacheService, CacheService>();
services.AddSingleton<ITaskCache, TaskCache>();
return services;
}
}
/// <summary>
/// No-op implementation of IDiscordService for compute workers
/// </summary>
internal class NoOpDiscordService : IDiscordService
{
public Task SendSignal(string message, TradingExchanges exchange, Ticker ticker, TradeDirection direction, Timeframe timeframe) => Task.CompletedTask;
public Task SendPosition(Position position) => Task.CompletedTask;
public Task SendClosingPosition(Position position) => Task.CompletedTask;
public Task SendMessage(string v) => Task.CompletedTask;
public Task SendTradeMessage(string message, bool isBadBehavior = false) => Task.CompletedTask;
public Task SendIncreasePosition(string address, Trade trade, string copyAccountName, Trade? oldTrade = null) => Task.CompletedTask;
public Task SendClosedPosition(string address, Trade oldTrade) => Task.CompletedTask;
public Task SendDecreasePosition(string address, Trade newTrade, decimal decreaseAmount) => Task.CompletedTask;
public Task SendBestTraders(List<Trader> traders) => Task.CompletedTask;
public Task SendBadTraders(List<Trader> traders) => Task.CompletedTask;
public Task SendDowngradedFundingRate(FundingRate oldRate) => Task.CompletedTask;
public Task SendNewTopFundingRate(FundingRate newRate) => Task.CompletedTask;
public Task SendFundingRateUpdate(FundingRate oldRate, FundingRate newRate) => Task.CompletedTask;
public Task SendDebugMessage(string message) => Task.CompletedTask;
}