Orchestrator¶
Orchestrator — это высокоуровневый компонент, который конфигурирует и оркестрирует приложение, парсер командной строки, DI и остальные компоненты, находящиеся по иерархии на уровне с App.
В то время как App отвечает за логику интерактивной сессии (ввод команд, маршрутизация), Orchestrator подготавливает окружение для его работы и служит точкой входа в приложение.
Инициализация¶
1DEFAULT_ARGPARSER: ArgParser = ArgParser(processed_args=[])
1def __init__(self, arg_parser: ArgParser = DEFAULT_ARGPARSER,
2 custom_providers: list[Provider] = [],
3 auto_inject_handlers: bool = True) -> None
Создаёт и конфигурирует экземпляр Orchestrator.
arg_parser: ЭкземплярArgParser, отвечающий за парсинг аргументов командной строки при запуске скрипта (не путать с командами в интерактивном режиме).custom_providers: Список пользовательских провайдеровdishka.Providerдля добавления ваших сервисов (например, подключений к БД или API-клиентов) в di-контейнер.auto_inject_handlers: Если True (по умолчанию),dishkaавтоматически внедрит зависимости в обработчики команд, инспектируя их сигнатуры.
Основные методы¶
- start_polling(self, app: App) None¶
Это главный метод, который запускает приложение. Он запускает бесконечный цикл ввода -> вывода.
- Параметры:
app – Экземпляр
App, который будет запущен.
Назначение и использование¶
Orchestrator абстрагирует сложность, связанную с настройкой DI и парсингом стартовых аргументов.
Такой подход разделяет ответственности: App отвечает за логику интерактивной сессии, а Orchestrator — за подготовку окружения и запуск приложения.
Пример использования:
import sqlite3
from sqlite3 import Connection
from typing import Iterable
from dishka import Provider, Scope, provide
from argenta import App, Orchestrator
class ConnectionProvider(Provider):
@provide(scope=Scope.REQUEST)
def new_connection(self) -> Iterable[Connection]:
conn = sqlite3.connect(":memory:")
yield conn
conn.close()
# 2. Create and configure App
app = App()
# ... you can add routers here ...
# 3. Create Orchestrator, passing our provider
orchestrator = Orchestrator(custom_providers=[ConnectionProvider()])
# 4. Start the application
if __name__ == "__main__":
orchestrator.start_polling(app)