Создание бота с использование Dependency injection
Начиная с версии библиотеки 0.5.0 появилась возможность задействовать dependency injection.
В данном примере будет показано как создать telegram бота с использование dependency injection в ASP.NET Core.
Пример - https://github.com/prethink/PRTelegramBot/tree/master/AspNetExample
В program.cs вы должны использовать метод AddBotHandlers()
builder.Services.AddBotHandlers();
или
builder.Services.AddTransientBotHandlers();
builder.Services.AddSingletonBotHandlers();
builder.Services.AddScopedBotHandlers();
Благодаря этому система найдет все классы в сборке которые помечены атрибутом BotHandler и создаст экземпляры классов, после чего пробросит все требуемые зависимости.
После var app = builder.Build() вы должны инициализировать создание экземпляра класса для telegram ботам и передать в билдер бота зависимость IServiceProvider.
var app = builder.Build();
var serviceProvider = app.Services.GetService<IServiceProvider>();
//Создание и запуск бота
var telegram = new PRBotBuilder("Token")
.SetServiceProvider(serviceProvider)
.Build();
Пример - Program.cs
using PRTelegramBot.Configs;
using PRTelegramBot.Core;
using PRTelegramBot.Extensions;
var builder = WebApplication.CreateBuilder(args);
//....Добавьте ваши зависимости
//Инициализация классов для работы ботов с DI
builder.Services.AddBotHandlers();
var app = builder.Build();
var serviceProvider = app.Services.GetService<IServiceProvider>();
var telegram = new PRBotBuilder("Token")
.SetServiceProvider(serviceProvider)
.Build();
await prBotInstance.Start();
app.Run();
Создайте класс с названием которое вам требуется и добавьте к нему атрибут BotHandler. Внутри класса укажите зависимости которые хотите пробросить и создайте команды обработчики внутри класса.
Сигнатура команды обработки:
[Атрибут обработки]
public async Task Название метода(ITelegramBotClient название , Update название )
{
//код
}
Пример - BotController.cs
namespace TestDI.BotController
{
[BotHandler]
public class BotController
{
private readonly ILogger<BotHandler> _logger;
public BotHandler(ILogger<BotHandler> logger)
{
_logger = logger;
}
[ReplyMenuHandler("Test")]
public async Task TestMethod(ITelegramBotClient botClient, Update update)
{
await PRTelegramBot.Helpers.Message.Send(botClient,update, $"{nameof(TestMethod)} {_logger != null}");
}
[SlashHandler("/test")]
public async Task Slash(ITelegramBotClient botClient, Update update)
{
await PRTelegramBot.Helpers.Message.Send(botClient, update, nameof(Slash));
}
[ReplyMenuHandler("inline")]
public async Task InlineTest(ITelegramBotClient botClient, Update update)
{
var options = new OptionMessage();
var menuItemns = MenuGenerator.InlineButtons(1, new List<IInlineContent> {
new InlineCallback("Test", THeader.CurrentPage),
new InlineCallback("TestStatic", THeader.NextPage)
});
options.MenuInlineKeyboardMarkup = MenuGenerator.InlineKeyboard(menuItemns );
await PRTelegramBot.Helpers.Message.Send(botClient, update, nameof(InlineTest), options);
}
[ReplyMenuHandler("inlinestatic")]
public async Task StaticInlineTest(ITelegramBotClient botClient, Update update)
{
var options = new OptionMessage();
var menuItemns = MenuGenerator.InlineButtons(1, new List<IInlineContent> {
new InlineCallback("Test", THeader.CurrentPage),
new InlineCallback("TestStatic", THeader.NextPage)
});
options.MenuInlineKeyboardMarkup = MenuGenerator.InlineKeyboard(menuItemns);
await PRTelegramBot.Helpers.Message.Send(botClient, update, nameof(StaticInlineTest), options);
}
[InlineCallbackHandler<THeader>(THeader.CurrentPage)]
public async Task InlineHandler(ITelegramBotClient botClient, Update update)
{
await PRTelegramBot.Helpers.Message.Send(botClient, update, nameof(InlineHandler));
}
[InlineCallbackHandler<THeader>(THeader.NextPage)]
public async static Task InlineHandlerStatic(ITelegramBotClient botClient, Update update)
{
await PRTelegramBot.Helpers.Message.Send(botClient, update, nameof(InlineHandlerStatic));
}
[ReplyMenuHandler("Test1")]
public async static Task StaticTestMethod(ITelegramBotClient botClient, Update update)
{
await PRTelegramBot.Helpers.Message.Send(botClient, update, nameof(StaticTestMethod));
}
}
}
Last updated