0

我正在用 N 层架构编写我的 Telegram Bot。我问了关于访问处置上下文的问题并在这里得到了答案。我编写了 HostedService 类和 MessageHandler,但出现了一个新错误,无法解决。

托管服务类:

public class TelegramHostedService : IHostedService
    {
        private IServiceScopeFactory _scopeFactory;
        private TelegramBotClient _client;
        private readonly string _token = "1973694233:AAHqgQSqs7lz-TE7n5HVCm5Z692ZRiivQcc";
        public TelegramHostedService(IServiceScopeFactory scopeFactory)
        {
            _scopeFactory = scopeFactory;
        }


        public Task StartAsync(CancellationToken cancellationToken)
        {
            _client = new TelegramBotClient(_token);
            _client.StartReceiving();
            _client.OnMessage += OnMessageHandlerAsync;

            return Task.CompletedTask;
        }

        private async void OnMessageHandlerAsync(object sender, MessageEventArgs e)
        {
            using var scope = _scopeFactory.CreateScope();
            var handler = scope.ServiceProvider.GetRequiredService<MessageHandler>();
            await handler.Handle(sender, e, _client);
        }

        public Task StopAsync(CancellationToken cancellationToken)
        {
            throw new System.NotImplementedException();
        }
    }

消息处理程序类:

public class MessageHandler
    {
        private readonly ParserService _parser;
        public MessageHandler(ParserService parser)
        {
            _parser = parser;
        }
        public async Task Handle(object sender, MessageEventArgs e, ITelegramBotClient _client)
        {
            if (e.Message is not { Type: Telegram.Bot.Types.Enums.MessageType.Text } || string.IsNullOrEmpty(e.Message.Text)) return;

            try
            {
                if (e.Message.Text.ToLower().Contains("/lastnews"))
                {
                    await SendArticleAsync(e.Message.Chat.Id, 0, 5, _client);
                }

                if (e.Message.Text.ToLower().Contains("/load"))
                {
                    await OnLoadMoreNewsAsync(e.Message.Chat.Id, 0, 5, _client);
                }

                if (e.Message.Text.ToLower().Contains("/subscribe"))
                {
                    await OnStartSubscibeAsync(e.Message.From.Username, e.Message.From.Id);
                }

            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
            }
        }

        private async Task SendArticleAsync(long chatId, int offset, int count, ITelegramBotClient _client)
        {
            var articles = await _parser.MakeHtmlRequest(offset, count);
            foreach (var article in articles)
            {
                var linkButton = KeyboardGoOver("Перейти", article.Href);
                await _client.SendPhotoAsync(chatId: chatId, photo: article.Image,
                    caption: $"*{article.Title}*", parseMode: Telegram.Bot.Types.Enums.ParseMode.Markdown, replyMarkup: linkButton);

            }
            await OnLoadMoreNewsAsync(chatId, offset + count, count, _client);
        }

        private static async Task OnLoadMoreNewsAsync(long chatId, int offset, int count, ITelegramBotClient _client)
        {
            var keyboard = new InlineKeyboardMarkup(new[]
            {
                new[]
                {
                    InlineKeyboardButton.WithCallbackData("Загрузить", $"load_{offset}_{count}")
                },

            });

            await _client.SendTextMessageAsync(chatId, "Хотите ли загрузить еще 5 новостей?", replyMarkup: keyboard);
        }

        private static async Task OnStartSubscibeAsync(string userName, long userId)
        {

        }

        private static InlineKeyboardMarkup KeyboardGoOver(string text, string url)
        {
            return new InlineKeyboardMarkup(new[]
            {
                new[]
                {
                    InlineKeyboardButton.WithUrl(text, url)
                },
            });
        }
    }

启动配置方法:

 public void ConfigureServices(IServiceCollection services)
        {
            services.AddControllers();

            services.AddDbContext<ApplicationContext>(options =>
                options.UseSqlServer(
                    Configuration.GetConnectionString("DefaultConnection"),
                    o => { o.CommandTimeout(100); }));
            BLLInjection.Injection(services);
            services.AddScoped<MessageHandler>();
            services.AddSwaggerGen(c =>
            {
                c.SwaggerDoc("v1", new OpenApiInfo { Title = "TelegramBot.WebApi", Version = "v1" });
            });
        }

您可以在我之前的问题中看到 BLL 和 DAL 注入。

当我从 Telegram 发送请求时,我收到以下错误:

System.AggregateException:“无法构造某些服务(验证服务描述符时出错“ServiceType:TelegramBot.WebApi.Handlers.MessageHandler Lifetime:Scoped ImplementationType:TelegramBot.WebApi.Handlers.MessageHandler”:无法解析服务类型'TelegramBot.BLL.Services.ParserService' 尝试激活'TelegramBot.WebApi.Handlers.MessageHandler'。)'

InvalidOperationException:尝试激活“TelegramBot.WebApi.Handlers.MessageHandler”时无法解析“TelegramBot.BLL.Services.ParserService”类型的服务。

4

0 回答 0