Skip to content

五层架构一览

一条铁律:依赖方向只能向下。 上层可以调用下层,下层永不反向依赖上层。

分层总览

┌───────────────────────────────────────────────┐
 App 层      入口 / 单实例保护 / CLI 解析
├───────────────────────────────────────────────┤
 Widget 层   MainWindow(瘦壳)/ 对话框 / 面板 / Manager
├───────────────────────────────────────────────┤
 Service 层  业务逻辑 + 数据校验(单例服务)
├───────────────────────────────────────────────┤
 Core 层     Entity / Plugin / Config / EventBus / Logger
├───────────────────────────────────────────────┤
 Utils 层    File / String / Gui / Json / Date 工具
└───────────────────────────────────────────────┘
职责
AppAgileApplication 启动流程、命令行解析、单实例保护。
WidgetUI 骨架。MainWindow 只搭菜单 / 工具栏 / Dock / 状态栏,业务逻辑下放到 Manager。
Service业务逻辑与数据校验,网络 / 加密 / 脚本 / AI / 更新等单例服务。
Core框架核心基础设施:实体、插件、配置类型系统、事件总线、命令栈、日志。
Utils无状态工具函数,谁都能用。

数据流

用户交互 → Widget(MainWindow / Dialog)
            ↓ 信号
        Manager(ActionManager / ThemeManager…)
            ↓ 调用
        Service(业务逻辑 + 校验)
            ↓ 调用
        Core(Entity / Repository / QueryBuilder)
            ↓ SQL
        Database(内存库 ← 高频读 | 磁盘库 ← 持久化)

Manager 拆分:拒绝 God Object

借鉴 QOwnNotes,MainWindow 是「瘦壳」,职责拆进独立 Manager—— ThemeManager · LayoutManager · ActionManager · PluginManager · SessionManager。 每个 Manager 只管一摊事,MainWindow 超过 500 行就该拆。

跨模块通信:EventBus

Manager 之间不互相摸内部状态,而是通过 EventBus 发布 / 订阅解耦:

模块 A ──publish──→ EventBus ──notify──→ 模块 B(订阅者)
                              ──notify──→ 模块 C(订阅者)

平台隔离

平台相关代码(#ifdef Q_OS_WIN / MACOS / LINUX)只允许出现在 platform/ 目录, 上层一律通过 PlatformHelper 接口调用——这保证了跨平台一致性。

约定优于配置 · AI 协作友好 · 编译期可验证