From 392e6bc7f51aa8f50a10c20514efb951d25776e6 Mon Sep 17 00:00:00 2001 From: Leonid Pershin Date: Fri, 17 Oct 2025 02:59:56 +0300 Subject: [PATCH] fix services --- ChatBot/Program.cs | 16 ++--- .../Telegram/Services/TelegramBotService.cs | 62 ++++++++++++------- ChatBot/Services/TelegramBotHostedService.cs | 46 -------------- 3 files changed, 44 insertions(+), 80 deletions(-) delete mode 100644 ChatBot/Services/TelegramBotHostedService.cs diff --git a/ChatBot/Program.cs b/ChatBot/Program.cs index 54c8b47..78b8efd 100644 --- a/ChatBot/Program.cs +++ b/ChatBot/Program.cs @@ -146,20 +146,12 @@ try builder.Services.AddScoped(); builder.Services.AddScoped(); - // Регистрируем TelegramBotService как scoped и используем один экземпляр для интерфейса и HostedService - builder.Services.AddScoped(); - builder.Services.AddScoped(sp => - sp.GetRequiredService() + // Регистрируем TelegramBotService как singleton и hosted service + builder.Services.AddSingleton(); + builder.Services.AddSingleton(provider => + (IHostedService)provider.GetRequiredService() ); - // Создаем обертку для HostedService, которая создает scope - builder.Services.AddSingleton(sp => - { - var serviceProvider = sp.GetRequiredService(); - var logger = sp.GetRequiredService>(); - return new TelegramBotHostedService(serviceProvider, logger); - }); - // Регистрируем Health Checks builder .Services.AddHealthChecks() diff --git a/ChatBot/Services/Telegram/Services/TelegramBotService.cs b/ChatBot/Services/Telegram/Services/TelegramBotService.cs index e522d35..ede50d9 100644 --- a/ChatBot/Services/Telegram/Services/TelegramBotService.cs +++ b/ChatBot/Services/Telegram/Services/TelegramBotService.cs @@ -1,6 +1,6 @@ -using ChatBot.Models.Configuration; using ChatBot.Services.Telegram.Interfaces; -using Microsoft.Extensions.Options; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Hosting; using Telegram.Bot; using Telegram.Bot.Polling; using Telegram.Bot.Types; @@ -11,41 +11,41 @@ namespace ChatBot.Services.Telegram.Services /// /// Основной сервис Telegram бота /// - public class TelegramBotService : BackgroundService, ITelegramBotService + public class TelegramBotService : ITelegramBotService, IHostedService { private readonly ILogger _logger; private readonly ITelegramBotClient _botClient; - private readonly ITelegramMessageHandler _messageHandler; - private readonly ITelegramErrorHandler _errorHandler; + private readonly IServiceProvider _serviceProvider; + private CancellationTokenSource? _cancellationTokenSource; public TelegramBotService( ILogger logger, ITelegramBotClient botClient, - ITelegramMessageHandler messageHandler, - ITelegramErrorHandler errorHandler + IServiceProvider serviceProvider ) { _logger = logger; _botClient = botClient; - _messageHandler = messageHandler; - _errorHandler = errorHandler; + _serviceProvider = serviceProvider; } /// /// Запускает бота /// - public override async Task StartAsync(CancellationToken cancellationToken) + public async Task StartAsync(CancellationToken cancellationToken = default) { var receiverOptions = new ReceiverOptions { AllowedUpdates = new[] { UpdateType.Message }, }; + _cancellationTokenSource = new CancellationTokenSource(); + _botClient.StartReceiving( - updateHandler: _messageHandler.HandleUpdateAsync, - errorHandler: _errorHandler.HandlePollingErrorAsync, + updateHandler: HandleUpdateAsync, + errorHandler: HandlePollingErrorAsync, receiverOptions: receiverOptions, - cancellationToken: cancellationToken + cancellationToken: _cancellationTokenSource.Token ); var botInfo = await GetBotInfoAsync(cancellationToken); @@ -62,10 +62,12 @@ namespace ChatBot.Services.Telegram.Services /// /// Останавливает бота /// - public override async Task StopAsync(CancellationToken cancellationToken) + public Task StopAsync(CancellationToken cancellationToken = default) { _logger.LogInformation("Stopping Telegram bot service..."); - await base.StopAsync(cancellationToken); + _cancellationTokenSource?.Cancel(); + _cancellationTokenSource?.Dispose(); + return Task.CompletedTask; } /// @@ -84,15 +86,31 @@ namespace ChatBot.Services.Telegram.Services } } - protected override async Task ExecuteAsync(CancellationToken stoppingToken) + private async Task HandleUpdateAsync( + ITelegramBotClient botClient, + Update update, + CancellationToken cancellationToken + ) { - await StartAsync(stoppingToken); + // Create a new scope for each message processing + using var scope = _serviceProvider.CreateScope(); + var messageHandler = + scope.ServiceProvider.GetRequiredService(); - // Keep the service running - while (!stoppingToken.IsCancellationRequested) - { - await Task.Delay(1000, stoppingToken); - } + await messageHandler.HandleUpdateAsync(botClient, update, cancellationToken); + } + + private async Task HandlePollingErrorAsync( + ITelegramBotClient botClient, + Exception exception, + CancellationToken cancellationToken + ) + { + // Create a new scope for error handling + using var scope = _serviceProvider.CreateScope(); + var errorHandler = scope.ServiceProvider.GetRequiredService(); + + await errorHandler.HandlePollingErrorAsync(botClient, exception, cancellationToken); } } } diff --git a/ChatBot/Services/TelegramBotHostedService.cs b/ChatBot/Services/TelegramBotHostedService.cs deleted file mode 100644 index 4d56753..0000000 --- a/ChatBot/Services/TelegramBotHostedService.cs +++ /dev/null @@ -1,46 +0,0 @@ -using ChatBot.Services.Telegram.Interfaces; -using Microsoft.Extensions.DependencyInjection; -using Microsoft.Extensions.Hosting; -using Microsoft.Extensions.Logging; - -namespace ChatBot.Services -{ - /// - /// Hosted service wrapper for TelegramBotService to handle scoped dependencies - /// - public class TelegramBotHostedService : IHostedService - { - private readonly IServiceProvider _serviceProvider; - private readonly ILogger _logger; - private ITelegramBotService? _botService; - - public TelegramBotHostedService( - IServiceProvider serviceProvider, - ILogger logger - ) - { - _serviceProvider = serviceProvider; - _logger = logger; - } - - public async Task StartAsync(CancellationToken cancellationToken) - { - _logger.LogInformation("Starting Telegram Bot Hosted Service..."); - - using var scope = _serviceProvider.CreateScope(); - _botService = scope.ServiceProvider.GetRequiredService(); - - await _botService.StartAsync(cancellationToken); - } - - public async Task StopAsync(CancellationToken cancellationToken) - { - _logger.LogInformation("Stopping Telegram Bot Hosted Service..."); - - if (_botService != null) - { - await _botService.StopAsync(cancellationToken); - } - } - } -}