Создание бота с использование Dependency injection

Начиная с версии библиотеки 0.5.0 появилась возможность задействовать dependency injection.

В данном примере будет показано как создать telegram бота с использование dependency injection в ASP.NET Core.

Пример - https://github.com/prethink/PRTelegramBot/tree/master/AspNetExample

  1. В program.cs вы должны использовать метод AddBotHandlers()

builder.Services.AddBotHandlers();
или
builder.Services.AddTransientBotHandlers();
builder.Services.AddSingletonBotHandlers();
builder.Services.AddScopedBotHandlers();

Благодаря этому система найдет все классы в сборке которые помечены атрибутом BotHandler и создаст экземпляры классов, после чего пробросит все требуемые зависимости.

  1. После 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();
  1. Создайте класс с названием которое вам требуется и добавьте к нему атрибут 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