ForcePilot/backend/package/yuxi/scheduler/infrastructure/container.py
Kris 08617091dc refactor: 整理项目包结构与导入路径
- 新增多个业务域的__init__.py模块文件,规范包导出结构
- 调整多个DTO文件的导入路径,统一模块组织方式
- 移除测试文件中多余的空行与导入语句
- 优化部分业务模块的包层级划分
2026-07-18 02:04:03 +08:00

100 lines
3.8 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

"""infrastructure/container.pyscheduler 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 create_repositories
from yuxi.scheduler.framework.runtime import HandlerRegistry, RuntimeServices
from yuxi.scheduler.use_cases.services.scheduler_service import SchedulerService
from yuxi.storage.transactions import SqlAlchemyTransactionAdapter
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)
tx_port = SqlAlchemyTransactionAdapter(db)
runtime = RuntimeServices(
handler_registry=None,
arq_pool=arq_pool,
config=app_config,
)
return SchedulerService(repos, runtime, tx_port)
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['redis']``)。
Returns:
装配完成的 ``SchedulerService`` 实例(持有完整 runtime
"""
repos = create_repositories(db)
tx_port = SqlAlchemyTransactionAdapter(db)
runtime = RuntimeServices(
handler_registry=handler_registry,
arq_pool=arq_pool,
config=app_config,
)
return SchedulerService(repos, runtime, tx_port)