# 模块化设计 **本文引用的文件** - [README.md](file://GFramework.Core/README.md) - [README.md](file://GFramework.Core.Abstractions/README.md) - [README.md](file://GFramework.Game/README.md) - [README.md](file://GFramework.Godot/README.md) - [Architecture.cs](file://GFramework.Core/architecture/Architecture.cs) - [IocContainer.cs](file://GFramework.Core/ioc/IocContainer.cs) - [EventBus.cs](file://GFramework.Core/events/EventBus.cs) - [AbstractModule.cs](file://GFramework.Game/architecture/AbstractModule.cs) - [IArchitectureModule.cs](file://GFramework.Core.Abstractions/architecture/IArchitectureModule.cs) - [AbstractModel.cs](file://GFramework.Core/model/AbstractModel.cs) - [AbstractSystem.cs](file://GFramework.Core/system/AbstractSystem.cs) - [AbstractCommand.cs](file://GFramework.Core/command/AbstractCommand.cs) - [AbstractQuery.cs](file://GFramework.Core/query/AbstractQuery.cs) - [BindableProperty.cs](file://GFramework.Core/property/BindableProperty.cs) - [StateMachine.cs](file://GFramework.Core/state/StateMachine.cs) - [SettingsModel.cs](file://GFramework.Game/setting/SettingsModel.cs) ## 目录 1. [简介](#简介) 2. [项目结构](#项目结构) 3. [核心组件](#核心组件) 4. [架构总览](#架构总览) 5. [详细组件分析](#详细组件分析) 6. [依赖分析](#依赖分析) 7. [性能考虑](#性能考虑) 8. [故障排查指南](#故障排查指南) 9. [结论](#结论) 10. [附录](#附录) ## 简介 本教程围绕 GFramework 的模块化设计展开,系统讲解模块化架构的设计原则与实现策略,包括关注点分离、依赖注入、接口抽象、事件驱动与生命周期管理等核心概念。教程将结合 GFramework.Core、GFramework.Core.Abstractions、GFramework.Game、GFramework.Godot 等模块,给出可复用的模块组件设计思路、模块间解耦策略、模块生命周期管理方法,并说明在大型游戏项目中的应用实践,涵盖功能模块划分、协作模式与版本兼容性管理。最后提供最佳实践与常见问题的解决方案。 ## 项目结构 GFramework 采用分层与模块化相结合的组织方式: - GFramework.Core:平台无关的核心框架,提供架构、IoC、事件、命令/查询、属性绑定、状态机等通用能力。 - GFramework.Core.Abstractions:核心抽象契约,定义接口、枚举与配置,确保可移植性与可替换性。 - GFramework.Game:游戏特定功能模块,提供设置、存储、序列化、UI 路由等游戏开发常用能力,并内置模块化架构。 - GFramework.Godot:Godot 平台集成模块,提供节点扩展、信号桥接、节点池化、日志集成等能力,与核心框架深度结合。 ```mermaid graph TB subgraph "核心层" Core["GFramework.Core
架构/事件/IoC/命令/查询/属性/状态机"] Abstractions["GFramework.Core.Abstractions
接口/枚举/配置"] end subgraph "游戏层" Game["GFramework.Game
设置/存储/序列化/UI路由/模块化架构"] GameAbstractions["GFramework.Game.Abstractions
游戏抽象接口"] end subgraph "平台层" Godot["GFramework.Godot
节点扩展/信号/池化/日志集成"] SourceGen["GFramework.SourceGenerators
上下文感知/日志生成器"] end Abstractions --> Core Core --> Game GameAbstractions --> Game Core --> Godot SourceGen --> Godot ``` 图表来源 - [README.md](file://GFramework.Core/README.md#L16-L508) - [README.md](file://GFramework.Core.Abstractions/README.md#L1-L522) - [README.md](file://GFramework.Game/README.md#L1-L1402) - [README.md](file://GFramework.Godot/README.md#L1-L893) 章节来源 - [README.md](file://GFramework.Core/README.md#L16-L508) - [README.md](file://GFramework.Core.Abstractions/README.md#L1-L522) - [README.md](file://GFramework.Game/README.md#L1-L1402) - [README.md](file://GFramework.Godot/README.md#L1-L893) ## 核心组件 - 架构与生命周期:通过 Architecture 管理组件注册、初始化阶段与销毁流程,支持模块安装与阶段感知。 - IoC 容器:IocContainer 提供注册、解析、冻结与多实例管理,支撑依赖注入与组件解耦。 - 事件系统:EventBus 提供类型事件的发送、注册与注销,实现跨层松耦合通信。 - 模块化架构:AbstractModule 与 IArchitectureModule 定义模块安装与阶段回调,支持模块化功能拆分与生命周期管理。 - 命令/查询:AbstractCommand/AbstractQuery 封装写/读操作,配合总线实现职责分离。 - 属性绑定:BindableProperty 支持数据变化通知,简化 UI 与模型的响应式绑定。 - 状态机:StateMachine 管理状态注册、切换与历史,支持状态驱动的模块行为。 - 设置模型:SettingsModel 管理设置数据与可应用设置,支持模块化配置与版本兼容。 章节来源 - [Architecture.cs](file://GFramework.Core/architecture/Architecture.cs#L1-L569) - [IocContainer.cs](file://GFramework.Core/ioc/IocContainer.cs#L1-L373) - [EventBus.cs](file://GFramework.Core/events/EventBus.cs#L1-L55) - [AbstractModule.cs](file://GFramework.Game/architecture/AbstractModule.cs#L1-L33) - [IArchitectureModule.cs](file://GFramework.Core.Abstractions/architecture/IArchitectureModule.cs#L1-L14) - [AbstractCommand.cs](file://GFramework.Core/command/AbstractCommand.cs#L1-L53) - [AbstractQuery.cs](file://GFramework.Core/query/AbstractQuery.cs#L1-L29) - [BindableProperty.cs](file://GFramework.Core/property/BindableProperty.cs#L1-L135) - [StateMachine.cs](file://GFramework.Core/state/StateMachine.cs#L1-L276) - [SettingsModel.cs](file://GFramework.Game/setting/SettingsModel.cs#L1-L103) ## 架构总览 GFramework 的模块化架构以 Architecture 为核心,通过 IoC 容器管理组件生命周期,借助事件系统实现跨层通信,模块通过 IArchitectureModule 接口安装到架构并在不同阶段执行逻辑。游戏层与平台层在此基础上扩展出设置、存储、序列化、UI 路由与 Godot 集成等能力。 ```mermaid classDiagram class Architecture { +InstallModule(module) +RegisterSystem(system) +RegisterModel(model) +RegisterUtility(utility) +Initialize() +Destroy() +CurrentPhase } class IArchitectureModule { +Install(architecture) +OnArchitecturePhase(phase) } class AbstractModule { +Install(architecture) +OnArchitecturePhase(phase) } class IocContainer { +RegisterPlurality(instance) +RegisterSingleton(instance) +Get() +GetAll() +Freeze() } class EventBus { +Send() +Register(handler) +UnRegister(handler) } class AbstractCommand { +Execute() #OnExecute(input) } class AbstractQuery { +Do() #OnDo(input) } class BindableProperty { +Value +Register(handler) +RegisterWithInitValue(handler) +UnRegister(handler) } class StateMachine { +Register(state) +ChangeTo() +GoBack() +GetState() } class SettingsModel { +GetData() +RegisterApplicator(applicator) +GetApplicator() +All() } AbstractModule ..|> IArchitectureModule Architecture --> IArchitectureModule : "安装/阶段通知" Architecture --> IocContainer : "依赖注入" Architecture --> EventBus : "事件总线" AbstractCommand --> Architecture : "上下文访问" AbstractQuery --> Architecture : "上下文访问" BindableProperty --> EventBus : "事件回调" StateMachine --> IState : "状态管理" SettingsModel --> ISettingsData : "数据节" SettingsModel --> IApplyAbleSettings : "应用器" ``` 图表来源 - [Architecture.cs](file://GFramework.Core/architecture/Architecture.cs#L1-L569) - [IocContainer.cs](file://GFramework.Core/ioc/IocContainer.cs#L1-L373) - [EventBus.cs](file://GFramework.Core/events/EventBus.cs#L1-L55) - [AbstractModule.cs](file://GFramework.Game/architecture/AbstractModule.cs#L1-L33) - [IArchitectureModule.cs](file://GFramework.Core.Abstractions/architecture/IArchitectureModule.cs#L1-L14) - [AbstractCommand.cs](file://GFramework.Core/command/AbstractCommand.cs#L1-L53) - [AbstractQuery.cs](file://GFramework.Core/query/AbstractQuery.cs#L1-L29) - [BindableProperty.cs](file://GFramework.Core/property/BindableProperty.cs#L1-L135) - [StateMachine.cs](file://GFramework.Core/state/StateMachine.cs#L1-L276) - [SettingsModel.cs](file://GFramework.Game/setting/SettingsModel.cs#L1-L103) ## 详细组件分析 ### 模块化架构与生命周期 - 模块安装:通过 Architecture.InstallModule 注册模块、注册生命周期钩子、调用模块 Install 并记录日志。 - 阶段感知:模块实现 IArchitecturePhaseAware,在架构不同阶段(如 BeforeUtilityInit、AfterModelInit、Ready、Destroying 等)执行相应逻辑。 - 延迟注册与严格阶段校验:通过 ArchitectureConfiguration 与 ArchitectureConstants 控制允许的阶段转换与延迟注册策略。 ```mermaid sequenceDiagram participant Arch as "Architecture" participant Mod as "AbstractModule" participant Hook as "IArchitectureLifecycle" participant Ctx as "IArchitectureContext" Arch->>Arch : "InstallModule(module)" Arch->>Hook : "RegisterLifecycleHook(module)" Arch->>Arch : "Container.RegisterPlurality(module)" Arch->>Mod : "module.Install(this)" Arch->>Arch : "NotifyPhaseAwareObjects(phase)" Arch->>Hook : "OnPhase(phase, this)" Arch->>Ctx : "Context.GetSystem/Model/Utility..." ``` 图表来源 - [Architecture.cs](file://GFramework.Core/architecture/Architecture.cs#L38-L48) - [AbstractModule.cs](file://GFramework.Game/architecture/AbstractModule.cs#L16-L26) - [IArchitectureModule.cs](file://GFramework.Core.Abstractions/architecture/IArchitectureModule.cs#L7-L13) 章节来源 - [Architecture.cs](file://GFramework.Core/architecture/Architecture.cs#L142-L223) - [AbstractModule.cs](file://GFramework.Game/architecture/AbstractModule.cs#L16-L26) - [IArchitectureModule.cs](file://GFramework.Core.Abstractions/architecture/IArchitectureModule.cs#L7-L13) ### 依赖注入与组件注册 - 注册策略:RegisterPlurality 将实例注册到其实现的所有接口与具体类型;RegisterSystem 便捷注册系统实例。 - 解析策略:Get、GetRequired、GetAll、GetAllSorted 提供多样的解析方式;Contains/ContainsInstance/Clear/Frozen 控制与查询。 - 线程安全:使用 ReaderWriterLockSlim 保证并发安全;冻结后禁止进一步注册。 ```mermaid flowchart TD Start(["开始"]) --> Reg["RegisterPlurality(instance)"] Reg --> Index["更新类型索引
注册具体类型与接口"] Index --> Resolve["Get/GetAll/GetRequired"] Resolve --> Found{"找到实例?"} Found --> |是| Return["返回实例/列表"] Found --> |否| NotFound["返回空/抛出异常"] Index --> Freeze["Freeze() 禁止注册"] Freeze --> End(["结束"]) Return --> End NotFound --> End ``` 图表来源 - [IocContainer.cs](file://GFramework.Core/ioc/IocContainer.cs#L105-L158) - [IocContainer.cs](file://GFramework.Core/ioc/IocContainer.cs#L211-L294) - [IocContainer.cs](file://GFramework.Core/ioc/IocContainer.cs#L357-L370) 章节来源 - [IocContainer.cs](file://GFramework.Core/ioc/IocContainer.cs#L69-L98) - [IocContainer.cs](file://GFramework.Core/ioc/IocContainer.cs#L105-L158) - [IocContainer.cs](file://GFramework.Core/ioc/IocContainer.cs#L211-L294) - [IocContainer.cs](file://GFramework.Core/ioc/IocContainer.cs#L357-L370) ### 事件系统与模块化通信 - 类型事件:EventBus.Send/Register/UnRegister 提供基于类型的事件发布与订阅。 - 模块化事件:模块在 Install 中注册事件监听,在 OnArchitecturePhase 中根据阶段处理事件,实现模块内聚与跨模块解耦。 ```mermaid sequenceDiagram participant Comp as "组件(System/Model/Controller)" participant Bus as "EventBus" participant Mod as "AbstractModule" Comp->>Bus : "Send(event)" Bus-->>Comp : "触发回调" Mod->>Bus : "Register(handler)" Bus-->>Mod : "回调触发" Mod->>Bus : "UnRegister(handler)" ``` 图表来源 - [EventBus.cs](file://GFramework.Core/events/EventBus.cs#L16-L54) - [AbstractModule.cs](file://GFramework.Game/architecture/AbstractModule.cs#L16-L26) 章节来源 - [EventBus.cs](file://GFramework.Core/events/EventBus.cs#L16-L54) - [AbstractModule.cs](file://GFramework.Game/architecture/AbstractModule.cs#L16-L26) ### 命令与查询的模块化应用 - 命令:AbstractCommand 封装写操作,通过 Context 获取模型与发送事件,实现业务逻辑与 UI 的解耦。 - 查询:AbstractQuery 封装读操作,通过输入参数与返回值实现清晰的职责分离。 ```mermaid flowchart TD UI["UI/Controller"] --> Cmd["AbstractCommand"] Cmd --> Ctx["Context(架构上下文)"] Ctx --> Model["Model"] Model --> Event["EventBus"] Event --> Sys["System"] Sys --> Model UI --> Qry["AbstractQuery"] Qry --> Model Model --> UI ``` 图表来源 - [AbstractCommand.cs](file://GFramework.Core/command/AbstractCommand.cs#L11-L27) - [AbstractQuery.cs](file://GFramework.Core/query/AbstractQuery.cs#L11-L29) 章节来源 - [AbstractCommand.cs](file://GFramework.Core/command/AbstractCommand.cs#L11-L27) - [AbstractQuery.cs](file://GFramework.Core/query/AbstractQuery.cs#L11-L29) ### 属性绑定与响应式更新 - BindableProperty 提供 Value 变更通知、注册/注销回调、带初始值的注册等能力,简化 UI 与模型的响应式绑定。 ```mermaid flowchart TD Prop["BindableProperty"] --> Set["SetValue(Value)"] Set --> Compare{"值变化?"} Compare --> |是| Callback["触发回调"] Compare --> |否| End["结束"] Callback --> End ``` 图表来源 - [BindableProperty.cs](file://GFramework.Core/property/BindableProperty.cs#L24-L41) - [BindableProperty.cs](file://GFramework.Core/property/BindableProperty.cs#L72-L96) 章节来源 - [BindableProperty.cs](file://GFramework.Core/property/BindableProperty.cs#L24-L41) - [BindableProperty.cs](file://GFramework.Core/property/BindableProperty.cs#L72-L96) ### 状态机与模块行为编排 - StateMachine 支持状态注册、切换、回退与历史管理,模块可通过状态机编排复杂行为,实现模块内状态驱动的解耦。 ```mermaid flowchart TD SM["StateMachine"] --> Reg["Register(state)"] Reg --> Can["CanChangeTo()"] Can --> |是| To["ChangeTo()"] Can --> |否| Reject["OnTransitionRejected"] To --> History["记录历史"] History --> Enter["OnEnter/OnExit"] Enter --> Done["完成切换"] SM --> Back["GoBack()"] Back --> Pop["弹出历史并切换"] ``` 图表来源 - [StateMachine.cs](file://GFramework.Core/state/StateMachine.cs#L88-L106) - [StateMachine.cs](file://GFramework.Core/state/StateMachine.cs#L210-L248) 章节来源 - [StateMachine.cs](file://GFramework.Core/state/StateMachine.cs#L88-L106) - [StateMachine.cs](file://GFramework.Core/state/StateMachine.cs#L210-L248) ### 设置模型与模块化配置 - SettingsModel 提供设置数据节与可应用设置的注册与获取,支持模块化配置与版本兼容。 ```mermaid classDiagram class SettingsModel { +GetData() +RegisterApplicator(applicator) +GetApplicator() +TryGet(type, out section) +All() } class ISettingsData class IApplyAbleSettings SettingsModel --> ISettingsData : "数据节" SettingsModel --> IApplyAbleSettings : "应用器" ``` 图表来源 - [SettingsModel.cs](file://GFramework.Game/setting/SettingsModel.cs#L19-L94) 章节来源 - [SettingsModel.cs](file://GFramework.Game/setting/SettingsModel.cs#L19-L94) ## 依赖分析 - 组件耦合与内聚:核心组件通过接口与上下文解耦,模块通过 Install 与阶段回调实现内聚功能。 - 直接与间接依赖:模块依赖 Architecture 与 IoC 容器;系统依赖模型与事件;命令/查询依赖上下文。 - 外部依赖与集成:Godot 集成通过节点扩展、信号桥接与日志工厂提供器实现平台特定能力。 ```mermaid graph TB Arch["Architecture"] --> Ctx["IArchitectureContext"] Arch --> IOC["IocContainer"] Arch --> Bus["EventBus"] Sys["AbstractSystem"] --> Arch Model["AbstractModel"] --> Arch Cmd["AbstractCommand"] --> Arch Qry["AbstractQuery"] --> Arch Mod["AbstractModule"] --> Arch Mod --> IOC Mod --> Bus Godot["GFramework.Godot"] --> Arch Game["GFramework.Game"] --> Arch ``` 图表来源 - [Architecture.cs](file://GFramework.Core/architecture/Architecture.cs#L72-L77) - [AbstractSystem.cs](file://GFramework.Core/system/AbstractSystem.cs#L13-L62) - [AbstractModel.cs](file://GFramework.Core/model/AbstractModel.cs#L11-L34) - [AbstractCommand.cs](file://GFramework.Core/command/AbstractCommand.cs#L11-L27) - [AbstractQuery.cs](file://GFramework.Core/query/AbstractQuery.cs#L11-L29) - [AbstractModule.cs](file://GFramework.Game/architecture/AbstractModule.cs#L9-L33) 章节来源 - [Architecture.cs](file://GFramework.Core/architecture/Architecture.cs#L72-L77) - [AbstractSystem.cs](file://GFramework.Core/system/AbstractSystem.cs#L13-L62) - [AbstractModel.cs](file://GFramework.Core/model/AbstractModel.cs#L11-L34) - [AbstractCommand.cs](file://GFramework.Core/command/AbstractCommand.cs#L11-L27) - [AbstractQuery.cs](file://GFramework.Core/query/AbstractQuery.cs#L11-L29) - [AbstractModule.cs](file://GFramework.Game/architecture/AbstractModule.cs#L9-L33) ## 性能考虑 - IoC 容器并发安全:使用 ReaderWriterLockSlim 提升读多写少场景下的并发性能;冻结后禁止注册,避免运行时结构变更带来的开销。 - 事件系统:事件注册与触发采用类型索引与事件实例管理,减少反射与装箱成本。 - 模块化阶段:通过阶段感知与延迟注册策略,避免在 Ready 阶段后进行昂贵的注册操作。 - 状态机历史:限制历史记录大小,平衡回退能力与内存占用。 ## 故障排查指南 - 阶段转换异常:当阶段转换不被允许时,架构会记录致命日志并抛出异常。检查 ArchitectureConstants 的允许转换列表与配置项 StrictPhaseValidation。 - 注册时机错误:在 Ready 阶段后尝试注册组件会抛出异常。确认组件注册在 Init 或 BeforeUtilityInit/BeforeModelInit/BeforeSystemInit 阶段。 - IoC 容器冻结:冻结后无法再注册实例,检查是否在 Initialize 后调用注册方法。 - 事件未注销:使用 IUnRegister 或扩展方法在节点退出树时自动注销,避免内存泄漏与逻辑错误。 - 模块安装失败:检查模块 Install 是否正确注册系统与工具,以及 OnArchitecturePhase 的阶段判断逻辑。 章节来源 - [Architecture.cs](file://GFramework.Core/architecture/Architecture.cs#L164-L183) - [Architecture.cs](file://GFramework.Core/architecture/Architecture.cs#L218-L223) - [IocContainer.cs](file://GFramework.Core/ioc/IocContainer.cs#L132-L137) - [IocContainer.cs](file://GFramework.Core/ioc/IocContainer.cs#L357-L370) ## 结论 GFramework 的模块化设计通过架构核心、IoC 容器、事件系统与模块接口,实现了高内聚、低耦合的可扩展架构。模块通过 Install 与阶段回调融入架构生命周期,结合命令/查询、属性绑定与状态机,能够有效支撑大型游戏项目的功能划分与协作。在实际项目中,建议遵循接口隔离、依赖倒置与组合优于继承的原则,合理划分模块边界,利用事件与配置模型实现版本兼容与演进。 ## 附录 - 快速开始与最佳实践参考:见 GFramework.Core 与 GFramework.Core.Abstractions 的 README。 - 平台集成:Godot 模块提供节点扩展、信号桥接与日志集成,便于在 Godot 中落地模块化架构。 - 游戏层扩展:Game 模块提供设置、存储、序列化与 UI 路由等能力,支持模块化配置与数据持久化。 章节来源 - [README.md](file://GFramework.Core/README.md#L110-L508) - [README.md](file://GFramework.Core.Abstractions/README.md#L416-L522) - [README.md](file://GFramework.Godot/README.md#L66-L893) - [README.md](file://GFramework.Game/README.md#L56-L1402)