Skip to content

Container — Dependency Injection

BaseBotContainer — это центральный реестр всех сервисов, настроек и фич вашего проекта. Он реализует паттерн Dependency Injection (Внедрение зависимостей), обеспечивая доступ к нужным объектам из любой части кода через объект Директора.


🏛 Роль Контейнера

Контейнер создается один раз при запуске бота и выполняет следующие задачи: 1. Хранение синглтонов: Здесь живут клиенты базы данных, API-клиенты, настройки и объект самого бота. 2. Управление ViewSender: Контейнер инициализирует сервис доставки UI сразу после того, как в него передается объект Bot. 3. Реестр фич: Все оркестраторы, найденные через DiscoveryService, регистрируются здесь. Директор обращается к контейнеру, чтобы найти нужную "сцену". 4. Централизованный RBAC: Метод is_admin() позволяет в одном месте определить логику проверки прав доступа (например, по списку owner_ids).


🔄 Жизненный цикл

  1. Инициализация: Контейнер создается с объектом настроек и (опционально) Redis-клиентом.
  2. Регистрация фич: Discovery наполняет словарь container.features.
  3. Привязка Бота: Вызывается container.set_bot(bot), что активирует ViewSender.
  4. Работа: Объект контейнера передается в каждый запрос через Middleware.
  5. Завершение (Shutdown): При выключении бота вызывается container.shutdown(), который автоматически закрывает соединения во всех зарегистрированных фичах.

✍️ Кастомизация

Обычно в проекте создается свой класс BotContainer, наследуемый от базового. Это позволяет добавить специфичные для вашего бота сервисы:

class MyBotContainer(BaseBotContainer):
    def __init__(self, settings, redis):
        super().__init__(settings, redis)
        # Добавляем свои сервисы
        self.db = MyDatabaseClient(settings.db_url)
        self.stats = AnalyticsService()

🧭 Связанные разделы

  • Director — обеспечивает доступ к контейнеру в оркестраторах.
  • Discovery — наполняет контейнер оркестраторами.
  • API: BaseBotContainer — техническое описание методов.