"""API 依赖注入:Repository / 研究服务的装配点(composition root 的一部分)。 路由层统一使用 Annotated 注入(FastAPI 推荐写法,配合 ruff B008 无冲突)。 """ from __future__ import annotations from typing import Annotated from fastapi import Depends from sqlalchemy.orm import Session from app.domain.repositories.jobs import ExperimentRepository, JobRepository from app.domain.repositories.market import ( DailyBarRepository, StockRepository, ) from app.infrastructure.persistence.sqlalchemy.repositories.market_impl import ( SqlAlchemyDailyBarRepository, SqlAlchemyStockRepository, ) from app.infrastructure.persistence.sqlalchemy.session import get_session from app.quant.engine import LocalEngine, QuantEngine from app.quant.service import ResearchService DbSession = Annotated[Session, Depends(get_session)] def _stock_repo_factory(session: DbSession) -> StockRepository: return SqlAlchemyStockRepository(session) def _daily_repo_factory(session: DbSession) -> DailyBarRepository: return SqlAlchemyDailyBarRepository(session) def _engine_factory() -> QuantEngine: return LocalEngine() def _service_factory( stock_repo: Annotated[StockRepository, Depends(_stock_repo_factory)], daily_repo: Annotated[DailyBarRepository, Depends(_daily_repo_factory)], engine: Annotated[QuantEngine, Depends(_engine_factory)], ) -> ResearchService: return ResearchService(stock_repo, daily_repo, engine) StockRepoDep = Annotated[StockRepository, Depends(_stock_repo_factory)] DailyRepoDep = Annotated[DailyBarRepository, Depends(_daily_repo_factory)] EngineDep = Annotated[QuantEngine, Depends(_engine_factory)] ResearchServiceDep = Annotated[ResearchService, Depends(_service_factory)] def _job_repo_factory(session: DbSession): from app.infrastructure.persistence.sqlalchemy.repositories.jobs_impl import ( SqlAlchemyJobRepository, ) return SqlAlchemyJobRepository(session) def _experiment_repo_factory(session: DbSession): from app.infrastructure.persistence.sqlalchemy.repositories.jobs_impl import ( SqlAlchemyExperimentRepository, ) return SqlAlchemyExperimentRepository(session) JobRepoDep = Annotated[JobRepository, Depends(_job_repo_factory)] ExperimentRepoDep = Annotated[ExperimentRepository, Depends(_experiment_repo_factory)]