Container — Dependency Injection
BaseBotContainer — это центральный реестр всех сервисов, настроек и фич вашего проекта. Он реализует паттерн Dependency Injection (Внедрение зависимостей), обеспечивая доступ к нужным объектам из любой части кода через объект Директора.
🏛 Роль Контейнера
Контейнер создается один раз при запуске бота и выполняет следующие задачи:
1. Хранение синглтонов: Здесь живут клиенты базы данных, API-клиенты, настройки и объект самого бота.
2. Управление ViewSender: Контейнер инициализирует сервис доставки UI сразу после того, как в него передается объект Bot.
3. Реестр фич: Все оркестраторы, найденные через DiscoveryService, регистрируются здесь. Директор обращается к контейнеру, чтобы найти нужную "сцену".
4. Централизованный RBAC: Метод is_admin() позволяет в одном месте определить логику проверки прав доступа (например, по списку owner_ids).
🔄 Жизненный цикл
- Инициализация: Контейнер создается с объектом настроек и (опционально) Redis-клиентом.
- Регистрация фич: Discovery наполняет словарь
container.features. - Привязка Бота: Вызывается
container.set_bot(bot), что активируетViewSender. - Работа: Объект контейнера передается в каждый запрос через Middleware.
- Завершение (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 — техническое описание методов.