# 模块化架构
**本文档引用的文件**
- [GFramework.Core.csproj](file://GFramework.Core/GFramework.Core.csproj)
- [GFramework.Core.Abstractions.csproj](file://GFramework.Core.Abstractions/GFramework.Core.Abstractions.csproj)
- [GFramework.Game.csproj](file://GFramework.Game/GFramework.Game.csproj)
- [GFramework.Game.Abstractions.csproj](file://GFramework.Game.Abstractions/GFramework.Game.Abstractions.csproj)
- [GFramework.Godot.csproj](file://GFramework.Godot/GFramework.Godot.csproj)
- [GFramework.Godot.SourceGenerators.csproj](file://GFramework.Godot.SourceGenerators/GFramework.Godot.SourceGenerators.csproj)
- [架构.cs](file://GFramework.Core/architecture/Architecture.cs)
- [架构配置.cs](file://GFramework.Core/architecture/ArchitectureConfiguration.cs)
- [游戏上下文.cs](file://GFramework.Core/architecture/GameContext.cs)
- [模块接口.cs](file://GFramework.Core.Abstractions/architecture/IArchitectureModule.cs)
- [抽象模块.cs](file://GFramework.Game/architecture/AbstractModule.cs)
- [抽象Godot模块.cs](file://GFramework.Godot/architecture/AbstractGodotModule.cs)
- [IGodot模块.cs](file://GFramework.Godot/architecture/IGodotModule.cs)
- [事件总线.cs](file://GFramework.Core/events/EventBus.cs)
- [简单事件.cs](file://GFramework.Core/events/EasyEvent.cs)
- [设置系统.cs](file://GFramework.Game/setting/SettingsSystem.cs)
- [UI路由器基类.cs](file://GFramework.Game/ui/UiRouterBase.cs)
## 目录
1. [引言](#引言)
2. [项目结构](#项目结构)
3. [核心组件](#核心组件)
4. [架构总览](#架构总览)
5. [详细组件分析](#详细组件分析)
6. [依赖关系分析](#依赖关系分析)
7. [性能考量](#性能考量)
8. [故障排查指南](#故障排查指南)
9. [结论](#结论)
10. [附录](#附录)
## 引言
本文件面向GFramework的模块化架构,系统性阐述模块边界设计、安装与卸载流程、模块内系统与工具的组织方式、模块间通过事件的松耦合通信模式,以及模块化架构的测试策略与维护建议。文档旨在帮助开发者在不牺牲可扩展性与可维护性的前提下,快速搭建稳定可靠的模块化系统。
## 项目结构
GFramework采用多项目分层与模块化组合的方式:
- 核心层:提供架构基座、生命周期管理、事件系统、IoC容器等通用能力
- 游戏层:在核心之上提供游戏域的系统与工具(如设置系统、UI路由器)
- 平台适配层:针对Godot平台提供模块与节点绑定能力
- 抽象层:定义跨层接口契约,确保模块边界清晰、可替换
```mermaid
graph TB
subgraph "核心层"
Core["GFramework.Core
架构/事件/IoC/系统/模型/工具"]
CoreAbst["GFramework.Core.Abstractions
接口契约"]
end
subgraph "游戏层"
Game["GFramework.Game
设置系统/UI路由器"]
GameAbst["GFramework.Game.Abstractions
游戏域接口"]
end
subgraph "平台层"
Godot["GFramework.Godot
Godot模块/节点/日志/场景注册"]
Gen["GFramework.Godot.SourceGenerators
源生成器"]
end
CoreAbst --> Core
GameAbst --> Game
Core --> Game
Game --> Godot
CoreAbst --> Godot
GameAbst --> Godot
Gen --> Godot
```
图表来源
- [GFramework.Core.csproj](file://GFramework.Core/GFramework.Core.csproj#L1-L13)
- [GFramework.Core.Abstractions.csproj](file://GFramework.Core.Abstractions/GFramework.Core.Abstractions.csproj#L1-L29)
- [GFramework.Game.csproj](file://GFramework.Game/GFramework.Game.csproj#L1-L17)
- [GFramework.Game.Abstractions.csproj](file://GFramework.Game.Abstractions/GFramework.Game.Abstractions.csproj#L1-L31)
- [GFramework.Godot.csproj](file://GFramework.Godot/GFramework.Godot.csproj#L1-L22)
- [GFramework.Godot.SourceGenerators.csproj](file://GFramework.Godot.SourceGenerators/GFramework.Godot.SourceGenerators.csproj#L1-L71)
章节来源
- [GFramework.Core.csproj](file://GFramework.Core/GFramework.Core.csproj#L1-L13)
- [GFramework.Core.Abstractions.csproj](file://GFramework.Core.Abstractions/GFramework.Core.Abstractions.csproj#L1-L29)
- [GFramework.Game.csproj](file://GFramework.Game/GFramework.Game.csproj#L1-L17)
- [GFramework.Game.Abstractions.csproj](file://GFramework.Game.Abstractions/GFramework.Game.Abstractions.csproj#L1-L31)
- [GFramework.Godot.csproj](file://GFramework.Godot/GFramework.Godot.csproj#L1-L22)
- [GFramework.Godot.SourceGenerators.csproj](file://GFramework.Godot.SourceGenerators/GFramework.Godot.SourceGenerators.csproj#L1-L71)
## 核心组件
- 架构基座:统一管理模块安装、组件注册、生命周期与阶段转换
- 模块接口与抽象:定义模块安装协议与阶段感知能力
- 事件系统:提供类型化事件总线,支持模块间松耦合通信
- 游戏域系统:设置系统、UI路由器等具体业务模块
章节来源
- [架构.cs](file://GFramework.Core/architecture/Architecture.cs#L38-L48)
- [模块接口.cs](file://GFramework.Core.Abstractions/architecture/IArchitectureModule.cs#L1-L14)
- [抽象模块.cs](file://GFramework.Game/architecture/AbstractModule.cs#L9-L33)
- [事件总线.cs](file://GFramework.Core/events/EventBus.cs#L8-L55)
- [设置系统.cs](file://GFramework.Game/setting/SettingsSystem.cs#L11-L99)
- [UI路由器基类.cs](file://GFramework.Game/ui/UiRouterBase.cs#L13-L725)
## 架构总览
模块化架构围绕“架构基座 + 模块 + 系统/工具”的层次展开。模块通过Install接入架构,注册自身系统与工具,参与架构生命周期与阶段转换;模块间通过事件总线进行解耦通信。
```mermaid
classDiagram
class 架构基座 {
+InstallModule(module)
+RegisterSystem(system)
+RegisterModel(model)
+RegisterUtility(utility)
+Initialize()/InitializeAsync()
+Destroy()
+EnterPhase(phase)
}
class 模块接口 {
<>
+Install(架构)
+OnPhase(...)
+OnArchitecturePhase(...)
}
class 抽象模块 {
+Install(架构)
+OnPhase(...)
+OnArchitecturePhase(...)
}
class 事件总线 {
+Send()
+Register(handler)
+UnRegister(handler)
}
class 设置系统 {
+ApplyAll()
+Apply()
+Apply(type)
}
class UI路由器基类 {
+Push(key,...)
+Pop(policy)
+Replace(key,...)
+Clear()
+RegisterHandler(...)
+UnregisterHandler(...)
}
模块接口 <|.. 抽象模块
架构基座 --> 模块接口 : "InstallModule()"
架构基座 --> 事件总线 : "使用"
设置系统 ..|> 系统接口
UI路由器基类 ..|> 系统接口
设置系统 --> 事件总线 : "发送设置事件"
UI路由器基类 --> 事件总线 : "发送UI切换事件"
```
图表来源
- [架构.cs](file://GFramework.Core/architecture/Architecture.cs#L38-L48)
- [模块接口.cs](file://GFramework.Core.Abstractions/architecture/IArchitectureModule.cs#L1-L14)
- [抽象模块.cs](file://GFramework.Game/architecture/AbstractModule.cs#L9-L33)
- [事件总线.cs](file://GFramework.Core/events/EventBus.cs#L8-L55)
- [设置系统.cs](file://GFramework.Game/setting/SettingsSystem.cs#L11-L99)
- [UI路由器基类.cs](file://GFramework.Game/ui/UiRouterBase.cs#L13-L725)
## 详细组件分析
### 模块边界与设计原则
- 边界清晰:模块通过IArchitectureModule定义安装入口与阶段感知,避免跨模块直接耦合
- 单一职责:每个模块聚焦于特定领域(如设置、UI、音频等),内部聚合相关系统与工具
- 可替换性:模块依赖接口而非具体实现,便于在不同平台或场景下替换
- 可观测性:模块安装与阶段变化均通过日志记录,便于问题定位
章节来源
- [模块接口.cs](file://GFramework.Core.Abstractions/architecture/IArchitectureModule.cs#L1-L14)
- [抽象模块.cs](file://GFramework.Game/architecture/AbstractModule.cs#L9-L33)
- [抽象Godot模块.cs](file://GFramework.Godot/architecture/AbstractGodotModule.cs#L11-L55)
- [IGodot模块.cs](file://GFramework.Godot/architecture/IGodotModule.cs#L10-L27)
### 模块安装与卸载流程
- 安装流程:架构调用InstallModule注册生命周期钩子、将模块注册到IoC容器并执行模块Install
- 卸载流程:通过架构Destroy触发销毁阶段,按注册逆序调用IDisposable组件的Destroy
```mermaid
sequenceDiagram
participant App as "应用"
participant Arch as "架构基座"
participant Mod as "模块"
participant Ctn as "IoC容器"
participant Bus as "事件总线"
App->>Arch : "InstallModule(模块)"
Arch->>Arch : "RegisterLifecycleHook(模块)"
Arch->>Ctn : "RegisterPlurality(模块)"
Arch->>Mod : "Install(架构)"
Arch->>Bus : "发送就绪事件(可选)"
App->>Arch : "Destroy()"
Arch->>Arch : "EnterPhase(Destroying)"
Arch->>Bus : "发送销毁中事件"
loop 逆序销毁
Arch->>Mod : "Destroy()"
end
Arch->>Arch : "EnterPhase(Destroyed)"
Arch->>Bus : "发送已销毁事件"
```
图表来源
- [架构.cs](file://GFramework.Core/architecture/Architecture.cs#L38-L48)
- [架构.cs](file://GFramework.Core/architecture/Architecture.cs#L357-L396)
章节来源
- [架构.cs](file://GFramework.Core/architecture/Architecture.cs#L38-L48)
- [架构.cs](file://GFramework.Core/architecture/Architecture.cs#L357-L396)
### 模块内系统与工具组织
- 系统注册:架构提供RegisterSystem/RegisterModel/RegisterUtility,统一设置上下文、注册生命周期并按阶段初始化
- 初始化阶段:工具 → 模型 → 系统,阶段间可插入自定义逻辑
- 上下文绑定:GameContext提供多架构上下文绑定与查询,便于跨模块访问
```mermaid
flowchart TD
Start(["模块Install"]) --> RegSys["注册系统/模型/工具"]
RegSys --> SetCtx["设置上下文"]
SetCtx --> RegLC["注册生命周期组件"]
RegLC --> PhaseTools["进入工具初始化阶段"]
PhaseTools --> InitTools["初始化工具"]
InitTools --> PhaseModels["进入模型初始化阶段"]
PhaseModels --> InitModels["初始化模型"]
InitModels --> PhaseSystems["进入系统初始化阶段"]
PhaseSystems --> InitSystems["初始化系统"]
InitSystems --> Freeze["冻结IoC容器"]
Freeze --> Ready["进入Ready阶段"]
```
图表来源
- [架构.cs](file://GFramework.Core/architecture/Architecture.cs#L423-L460)
- [架构.cs](file://GFramework.Core/architecture/Architecture.cs#L264-L330)
- [游戏上下文.cs](file://GFramework.Core/architecture/GameContext.cs#L9-L111)
章节来源
- [架构.cs](file://GFramework.Core/architecture/Architecture.cs#L423-L460)
- [架构.cs](file://GFramework.Core/architecture/Architecture.cs#L264-L330)
- [游戏上下文.cs](file://GFramework.Core/architecture/GameContext.cs#L9-L111)
### 模块间通信:事件驱动的松耦合
- 类型化事件:EventBus提供基于类型的Send/Register/UnRegister,模块通过事件发布/订阅实现解耦
- 典型场景:设置系统在应用设置前后发送事件;UI路由器在页面切换前后发送事件
```mermaid
sequenceDiagram
participant ModA as "模块A"
participant Bus as "事件总线"
participant ModB as "模块B"
ModA->>Bus : "Send(事件A)"
Bus-->>ModB : "触发监听器"
ModB-->>Bus : "UnRegister(监听器)"
```
图表来源
- [事件总线.cs](file://GFramework.Core/events/EventBus.cs#L8-L55)
- [简单事件.cs](file://GFramework.Core/events/EasyEvent.cs#L8-L39)
- [设置系统.cs](file://GFramework.Game/setting/SettingsSystem.cs#L86-L98)
- [UI路由器基类.cs](file://GFramework.Game/ui/UiRouterBase.cs#L339-L364)
章节来源
- [事件总线.cs](file://GFramework.Core/events/EventBus.cs#L8-L55)
- [简单事件.cs](file://GFramework.Core/events/EasyEvent.cs#L8-L39)
- [设置系统.cs](file://GFramework.Game/setting/SettingsSystem.cs#L86-L98)
- [UI路由器基类.cs](file://GFramework.Game/ui/UiRouterBase.cs#L339-L364)
### 具体模块示例:设置模块与UI模块
- 设置模块(SettingsSystem)
- 负责批量/按类型应用设置,发送应用前/后事件,捕获异常并上报
- UI模块(UiRouterBase)
- 提供页面栈管理、层级管理、路由守卫、UI切换处理器管道与事件
章节来源
- [设置系统.cs](file://GFramework.Game/setting/SettingsSystem.cs#L11-L99)
- [UI路由器基类.cs](file://GFramework.Game/ui/UiRouterBase.cs#L13-L725)
## 依赖关系分析
- 核心层依赖抽象层,保证接口稳定
- 游戏层依赖核心层与抽象层,提供业务系统
- 平台层依赖核心与游戏抽象层,提供平台适配
- 源生成器作为编译期工具,不引入运行时依赖
```mermaid
graph LR
CoreAbst["Core.Abstractions"] --> Core["Core"]
GameAbst["Game.Abstractions"] --> Game["Game"]
CoreAbst --> Godot["Godot"]
GameAbst --> Godot
Core --> Game
CoreAbst --> GameAbst
Gen["Godot.SourceGenerators"] --> Godot
```
图表来源
- [GFramework.Core.csproj](file://GFramework.Core/GFramework.Core.csproj#L9-L12)
- [GFramework.Game.csproj](file://GFramework.Game/GFramework.Game.csproj#L9-L12)
- [GFramework.Godot.csproj](file://GFramework.Godot/GFramework.Godot.csproj#L16-L20)
- [GFramework.Godot.SourceGenerators.csproj](file://GFramework.Godot.SourceGenerators/GFramework.Godot.SourceGenerators.csproj#L30-L33)
章节来源
- [GFramework.Core.csproj](file://GFramework.Core/GFramework.Core.csproj#L9-L12)
- [GFramework.Game.csproj](file://GFramework.Game/GFramework.Game.csproj#L9-L12)
- [GFramework.Godot.csproj](file://GFramework.Godot/GFramework.Godot.csproj#L16-L20)
- [GFramework.Godot.SourceGenerators.csproj](file://GFramework.Godot.SourceGenerators/GFramework.Godot.SourceGenerators.csproj#L30-L33)
## 性能考量
- 初始化阶段分层:工具/模型/系统分阶段初始化,有利于资源占用与启动时间控制
- 生命周期去重:注册去重集合避免重复初始化与销毁
- 事件总线:类型化事件减少反射开销,支持异步处理
- UI切换:前置与后置阶段分离,避免阻塞主线程
章节来源
- [架构.cs](file://GFramework.Core/architecture/Architecture.cs#L264-L330)
- [架构.cs](file://GFramework.Core/architecture/Architecture.cs#L229-L258)
- [UI路由器基类.cs](file://GFramework.Game/ui/UiRouterBase.cs#L339-L364)
## 故障排查指南
- 阶段转换异常:检查架构配置的严格阶段校验与允许的阶段转换表
- 注册时机错误:在Ready之后仍尝试注册组件会抛出异常,需在Install或BeforeReady阶段完成
- 销毁异常:单个组件销毁异常不会影响整体销毁流程,但会记录错误日志
- 事件未触发:确认事件监听器已注册且事件类型一致
章节来源
- [架构.cs](file://GFramework.Core/architecture/Architecture.cs#L164-L183)
- [架构.cs](file://GFramework.Core/architecture/Architecture.cs#L407-L414)
- [架构.cs](file://GFramework.Core/architecture/Architecture.cs#L377-L387)
- [事件总线.cs](file://GFramework.Core/events/EventBus.cs#L41-L54)
## 结论
GFramework的模块化架构通过清晰的模块边界、统一的生命周期管理与事件驱动的通信机制,实现了高内聚、低耦合的系统设计。遵循本文的最佳实践,可在复杂项目中保持模块的独立性与演进速度,同时降低集成风险。
## 附录
- 测试策略建议
- 模块独立测试:对模块内的系统与工具进行单元测试,模拟Install与Initialize流程
- 集成测试:通过Mock事件总线与IoC容器,验证模块间事件交互与阶段流转
- 平台适配测试:在Godot环境下验证模块的节点绑定与生命周期钩子
- 维护建议
- 严格遵守模块边界,避免跨模块直接依赖
- 通过事件总线传递消息,减少硬编码耦合
- 定期重构:拆分过大的模块,提炼公共工具与系统
- 文档与契约:保持抽象层接口稳定,逐步演进实现层