"""infrastructure/container.py:scheduler use_cases service 装配容器。 本模块是六边形架构的"唯一装配点"(对齐 ``external_systems/infrastructure/container.py``), 负责将 persistence 仓储 / runtime 横切关注点装配为 ``SchedulerService``。 对外暴露 factory: - ``create_scheduler_service``:api 进程请求级 factory,``handler_registry=None``, 仅支持查询与写操作类用例;``trigger_task`` 端点需显式传入 ``arq_pool``。 - ``create_worker_scheduler_service``:worker 进程请求级 factory,传入 worker 进程级 ``HandlerRegistry`` 与 ``arq_pool``,支持 ``tick`` / ``execute_task`` / ``trigger_task`` 全部用例。由 ``services/scheduler_tick.py`` 的 ARQ 函数在每次调用时创建。 边界规范: - 本模块是**唯一允许 import ``SchedulerService`` 实现类**的地方 - ``HandlerRegistry`` 与 ``arq_pool`` 的进程级生命周期由 worker 启动钩子管理 (见 ``services/run_worker.py`` 的 ``_worker_startup``),factory 仅负责请求级装配 """ from __future__ import annotations from typing import TYPE_CHECKING from sqlalchemy.ext.asyncio import AsyncSession from yuxi.config.app import config as app_config from yuxi.scheduler.adapters.persistence import ( SqlAlchemyUnitOfWork, create_repositories, ) from yuxi.scheduler.framework.runtime import HandlerRegistry, RuntimeServices from yuxi.scheduler.use_cases.services.scheduler_service import SchedulerService if TYPE_CHECKING: from arq import ArqRedis __all__ = [ "SchedulerService", "create_scheduler_service", "create_worker_scheduler_service", ] def create_scheduler_service( db: AsyncSession, *, arq_pool: ArqRedis | None = None, ) -> SchedulerService: """api 进程请求级工厂:从 db session 创建 ``SchedulerService`` 实例。 封装三层创建逻辑(repos + runtime + service),对调用方隐藏内部依赖结构。 由 router 在请求开始时调用。 Args: db: SQLAlchemy 异步会话(请求级)。 arq_pool: ARQ 连接池,仅 ``trigger_task`` 端点需要传入; 查询 / CRUD / 状态机类端点不传入(``None``)。 Returns: 装配完成的 ``SchedulerService`` 实例(``handler_registry=None``)。 """ repos = create_repositories(db) uow = SqlAlchemyUnitOfWork(db) runtime = RuntimeServices( handler_registry=None, arq_pool=arq_pool, config=app_config, ) return SchedulerService(repos, runtime, uow) def create_worker_scheduler_service( db: AsyncSession, *, handler_registry: HandlerRegistry, arq_pool: ArqRedis, ) -> SchedulerService: """worker 进程请求级工厂:创建带完整 runtime 的 ``SchedulerService`` 实例。 与 ``create_scheduler_service`` 的区别:传入 worker 进程级 ``HandlerRegistry`` 与 ``arq_pool``,支持 ``tick`` / ``execute_task`` / ``trigger_task`` 全部用例。 由 ``services/scheduler_tick.py`` 的 ARQ 函数在每次调用时创建,``HandlerRegistry`` 与 ``arq_pool`` 的进程级生命周期由 worker 启动钩子管理。 Args: db: SQLAlchemy 异步会话(请求级,每次调用新建)。 handler_registry: worker 进程级 handler 注册表(startup 时装配填充)。 arq_pool: worker 进程级 ARQ 连接池(ARQ 注入的 ``ctx['pool']``)。 Returns: 装配完成的 ``SchedulerService`` 实例(持有完整 runtime)。 """ repos = create_repositories(db) uow = SqlAlchemyUnitOfWork(db) runtime = RuntimeServices( handler_registry=handler_registry, arq_pool=arq_pool, config=app_config, ) return SchedulerService(repos, runtime, uow)