certflow.bootstrap module¶
应用装配(Application Bootstrap / Composition Root)
阶段 B 的落地模块:把「数据库管理器从哪来、会话从哪来、Service 如何构造」
收口到单一的装配入口,消除散落在 BaseController / PrintQueueController
里的隐式 DatabaseManager() 兜底与建表副作用。
设计约束(来自 tests/conftest.py 的书面约定):
- 提供工厂 build_context(db_manager=None) -> AppContext。
- AppContext 至少暴露 .db_manager 与 .session 两个属性,
以兼容现有
app_contextfixture 的调用方签名。
本模块刻意保持轻量:不做全局单例强制、不接管 Qt 对象、不 eager 创建有
副作用的 Service(如 PrinterManager 会起监控线程、
CertificatePrintService 构造期 os.makedirs)。这些仍以「按需 provider」
形式存在,未来逐 Controller 迁移时再逐一定义。
- class certflow.bootstrap.AppContext(db_manager, session=None)[源代码]¶
基类:
object应用装配上下文
持有唯一的
DatabaseManager与一个可选预创建的会话,作为 Controller / Service 依赖的统一来源。- 参数:
db_manager (DatabaseManager)
session (Session | None)
- db_manager¶
数据库管理器实例(唯一权威来源)
- session¶
预创建的数据库会话(由
build_context打开, 调用方可直接使用;不使用时由close()释放)
- get_session()[源代码]¶
获取一个数据库会话
若已持有会话(构造时预创建,或外部赋值
ctx.session = ...)则复用之; 否则即时从db_manager新建。即时新建的会话由调用方负责close()。- 返回:
可用的 SQLAlchemy 会话
- 返回类型:
Session
- get_service(service_cls, *args, **kwargs)[源代码]¶
以本上下文会话为首个参数构造一个 Service 实例
收口「
Service(self.session)散落各处」的构造方式:调用方不再 直接触碰self.session,而是统一经此工厂获取 Service,使 session 来源(默认上下文 / 注入的 db_manager)成为唯一权威。仅适用于构造签名首个位置参数为
Session的 Service;首个参数非 会话的 Service(如PrinterService(printer_name))不应走此工厂。
- certflow.bootstrap.build_context(db_manager=None)[源代码]¶
构建应用装配上下文
约定入口:应用启动时由
main.init_database_manager()注入已初始化的db_manager;测试 fixture 注入临时库db_manager;二者皆无时惰性 创建一个默认DatabaseManager()``(原本散落在 ``BaseController的兜底 逻辑,现集中到此处单一来源)。- 参数:
db_manager (DatabaseManager | None) -- 已配置(且按需 init_db)的数据库管理器;为 None 时惰性创建默认实例。
- 返回:
装配好的应用上下文
- 返回类型: