我正在用 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”类型的服务。