# 高级模式教程 **本文档引用的文件** - [Architecture.cs](file://GFramework.Core/architecture/Architecture.cs) - [AbstractModule.cs](file://GFramework.Game/architecture/AbstractModule.cs) - [CommandBus.cs](file://GFramework.Core/command/CommandBus.cs) - [AbstractCommand.cs](file://GFramework.Core/command/AbstractCommand.cs) - [QueryBus.cs](file://GFramework.Core/query/QueryBus.cs) - [AbstractQuery.cs](file://GFramework.Core/query/AbstractQuery.cs) - [EventBus.cs](file://GFramework.Core/events/EventBus.cs) - [EasyEvent.cs](file://GFramework.Core/events/EasyEvent.cs) - [StateMachine.cs](file://GFramework.Core/state/StateMachine.cs) - [StateMachineSystem.cs](file://GFramework.Core/state/StateMachineSystem.cs) - [GameStateMachineSystem.cs](file://GFramework.Game/state/GameStateMachineSystem.cs) - [CommandBusTests.cs](file://GFramework.Core.Tests/command/CommandBusTests.cs) - [StateMachineTests.cs](file://GFramework.Core.Tests/state/StateMachineTests.cs) - [EventBusTests.cs](file://GFramework.Core.Tests/events/EventBusTests.cs) - [advanced-patterns.md](file://docs/tutorials/advanced-patterns.md) ## 目录 1. [简介](#简介) 2. [项目结构](#项目结构) 3. [核心组件](#核心组件) 4. [架构概览](#架构概览) 5. [详细组件分析](#详细组件分析) 6. [依赖关系分析](#依赖关系分析) 7. [性能考虑](#性能考虑) 8. [故障排除指南](#故障排除指南) 9. [结论](#结论) 10. [附录](#附录) ## 简介 本教程面向希望深入掌握 GFramework 高级架构模式的开发者,围绕以下主题展开: - CQRS(命令查询职责分离):命令总线与查询总线的实现、异步处理、输入输出模型设计 - 事件驱动架构:事件系统高级用法、事件聚合与事件溯源模式 - 插件系统:模块化架构、动态模块加载与模块间通信 - 状态机模式:复杂状态转换、状态持久化与扩展性设计 - 实战示例与最佳实践:通过测试用例与教程文档中的示例路径,帮助读者快速落地 ## 项目结构 GFramework 采用分层与模块化的组织方式: - GFramework.Core:核心框架,包含架构基类、命令/查询总线、事件系统、状态机、生命周期管理等 - GFramework.Game:游戏层实现,包含游戏状态机系统、设置系统、UI 路由等 - GFramework.Godot:Godot 平台适配层,提供平台特定的扩展与集成 - 文档与测试:教程文档与全面的单元测试覆盖关键组件的行为 ```mermaid graph TB subgraph "核心框架" CoreArch["架构基类
Architecture.cs"] CmdBus["命令总线
CommandBus.cs"] QryBus["查询总线
QueryBus.cs"] EventBus["事件总线
EventBus.cs"] StateMachine["状态机
StateMachine.cs"] StateSys["状态机系统
StateMachineSystem.cs"] end subgraph "游戏层" GameMod["模块基类
AbstractModule.cs"] GameSM["游戏状态机系统
GameStateMachineSystem.cs"] end subgraph "文档与测试" Docs["高级模式教程
advanced-patterns.md"] CmdTests["命令总线测试
CommandBusTests.cs"] StateTests["状态机测试
StateMachineTests.cs"] EventTests["事件总线测试
EventBusTests.cs"] end CoreArch --> CmdBus CoreArch --> QryBus CoreArch --> EventBus CoreArch --> StateMachine StateMachine --> StateSys GameMod --> CoreArch GameSM --> StateSys Docs --> CmdBus Docs --> QryBus Docs --> EventBus Docs --> StateMachine CmdTests --> CmdBus StateTests --> StateMachine EventTests --> EventBus ``` **图表来源** - [Architecture.cs](file://GFramework.Core/architecture/Architecture.cs#L1-L569) - [CommandBus.cs](file://GFramework.Core/command/CommandBus.cs#L1-L62) - [QueryBus.cs](file://GFramework.Core/query/QueryBus.cs#L1-L23) - [EventBus.cs](file://GFramework.Core/events/EventBus.cs#L1-L55) - [StateMachine.cs](file://GFramework.Core/state/StateMachine.cs#L1-L276) - [StateMachineSystem.cs](file://GFramework.Core/state/StateMachineSystem.cs#L1-L96) - [AbstractModule.cs](file://GFramework.Game/architecture/AbstractModule.cs#L1-L33) - [GameStateMachineSystem.cs](file://GFramework.Game/state/GameStateMachineSystem.cs#L1-L26) - [advanced-patterns.md](file://docs/tutorials/advanced-patterns.md#L1-L800) - [CommandBusTests.cs](file://GFramework.Core.Tests/command/CommandBusTests.cs#L1-L265) - [StateMachineTests.cs](file://GFramework.Core.Tests/state/StateMachineTests.cs#L1-L444) - [EventBusTests.cs](file://GFramework.Core.Tests/events/EventBusTests.cs#L1-L85) **章节来源** - [Architecture.cs](file://GFramework.Core/architecture/Architecture.cs#L1-L569) - [AbstractModule.cs](file://GFramework.Game/architecture/AbstractModule.cs#L1-L33) - [advanced-patterns.md](file://docs/tutorials/advanced-patterns.md#L1-L800) ## 核心组件 本节聚焦于 CQRS、事件驱动与状态机三大核心能力,以及它们在架构中的位置与协作方式。 - 命令查询职责分离(CQRS) - 命令总线:同步与异步执行命令,支持带返回值与无返回值两种模式 - 查询总线:执行查询并返回结果 - 输入输出模型:命令/查询分别通过输入接口约束参数,确保职责清晰 - 事件驱动架构 - 事件总线:基于类型的事件发送、注册与注销 - 简易事件:最小化实现,便于快速注册/触发 - 事件溯源:教程文档提供了事件存储、快照与聚合根重建的思路 - 状态机模式 - 状态机:注册/注销状态、状态切换、历史记录与回退 - 状态机系统:上下文感知、生命周期钩子、状态变更事件通知 - 游戏状态机系统:针对游戏场景的状态判断与获取 **章节来源** - [CommandBus.cs](file://GFramework.Core/command/CommandBus.cs#L1-L62) - [AbstractCommand.cs](file://GFramework.Core/command/AbstractCommand.cs#L1-L53) - [QueryBus.cs](file://GFramework.Core/query/QueryBus.cs#L1-L23) - [AbstractQuery.cs](file://GFramework.Core/query/AbstractQuery.cs#L1-L29) - [EventBus.cs](file://GFramework.Core/events/EventBus.cs#L1-L55) - [EasyEvent.cs](file://GFramework.Core/events/EasyEvent.cs#L1-L39) - [StateMachine.cs](file://GFramework.Core/state/StateMachine.cs#L1-L276) - [StateMachineSystem.cs](file://GFramework.Core/state/StateMachineSystem.cs#L1-L96) - [GameStateMachineSystem.cs](file://GFramework.Game/state/GameStateMachineSystem.cs#L1-L26) ## 架构概览 GFramework 的架构基类负责模块安装、生命周期管理、阶段转换与组件注册。它通过 IOC 容器统一管理系统、模型与工具,并在初始化完成后冻结容器,确保运行时的稳定性。 ```mermaid classDiagram class Architecture { +InstallModule(module) +RegisterSystem(system) +RegisterModel(model) +RegisterUtility(utility) +Initialize() +InitializeAsync() +Destroy() -EnterPhase(next) -ValidatePhaseTransition(next) -NotifyPhase(phase) -NotifyPhaseAwareObjects(phase) -RegisterLifecycleComponent(component) } class IArchitectureModule { +Install(architecture) +OnArchitecturePhase(phase) +OnPhase(phase, architecture) } class AbstractModule { +Install(architecture) +OnArchitecturePhase(phase) +OnPhase(phase, architecture) } Architecture --> IArchitectureModule : "安装模块" AbstractModule ..|> IArchitectureModule ``` **图表来源** - [Architecture.cs](file://GFramework.Core/architecture/Architecture.cs#L38-L48) - [Architecture.cs](file://GFramework.Core/architecture/Architecture.cs#L423-L460) - [Architecture.cs](file://GFramework.Core/architecture/Architecture.cs#L511-L566) - [AbstractModule.cs](file://GFramework.Game/architecture/AbstractModule.cs#L9-L33) **章节来源** - [Architecture.cs](file://GFramework.Core/architecture/Architecture.cs#L1-L569) - [AbstractModule.cs](file://GFramework.Game/architecture/AbstractModule.cs#L1-L33) ## 详细组件分析 ### CQRS 模式实现与应用 CQRS 将写操作(命令)与读操作(查询)分离,提升系统的可扩展性与可维护性。GFramework 提供了命令总线与查询总线,配合抽象命令/查询基类,形成清晰的输入输出模型。 - 命令总线 - 支持同步与异步命令执行 - 带返回值与无返回值两种 Send/SendAsync 重载 - 参数校验:空命令抛出异常 - 查询总线 - 执行查询并返回结果 - 通过抽象查询基类约束输入与输出 - 输入输出模型 - 命令/查询均通过输入接口约束参数,确保职责单一 - 可结合上下文与日志生成器,实现跨组件的上下文感知 ```mermaid sequenceDiagram participant Client as "客户端" participant CmdBus as "命令总线" participant Cmd as "命令" participant QryBus as "查询总线" participant Qry as "查询" Client->>CmdBus : "Send/ICommand" CmdBus->>Cmd : "Execute()" Cmd-->>Client : "完成/返回值" Client->>CmdBus : "SendAsync/IAsyncCommand" CmdBus->>Cmd : "ExecuteAsync()" Cmd-->>Client : "Task/Task" Client->>QryBus : "Send/IQuery" QryBus->>Qry : "Do()" Qry-->>Client : "TResult" ``` **图表来源** - [CommandBus.cs](file://GFramework.Core/command/CommandBus.cs#L16-L61) - [AbstractCommand.cs](file://GFramework.Core/command/AbstractCommand.cs#L11-L27) - [AbstractCommand.cs](file://GFramework.Core/command/AbstractCommand.cs#L35-L53) - [QueryBus.cs](file://GFramework.Core/query/QueryBus.cs#L16-L22) - [AbstractQuery.cs](file://GFramework.Core/query/AbstractQuery.cs#L11-L29) - 实战示例与最佳实践 - 教程文档提供了完整的 CQRS 示例:命令(创建玩家)、查询(获取玩家、统计信息)与领域事件 - 使用上下文发送命令/查询,结合日志记录错误与成功信息 - 建议将命令/查询输入参数封装为独立 DTO,便于测试与演进 **章节来源** - [CommandBus.cs](file://GFramework.Core/command/CommandBus.cs#L1-L62) - [AbstractCommand.cs](file://GFramework.Core/command/AbstractCommand.cs#L1-L53) - [QueryBus.cs](file://GFramework.Core/query/QueryBus.cs#L1-L23) - [AbstractQuery.cs](file://GFramework.Core/query/AbstractQuery.cs#L1-L29) - [CommandBusTests.cs](file://GFramework.Core.Tests/command/CommandBusTests.cs#L1-L265) - [advanced-patterns.md](file://docs/tutorials/advanced-patterns.md#L159-L205) ### 事件驱动架构实现 GFramework 的事件系统提供基于类型的事件发送、注册与注销,支持同步与异步处理。教程文档进一步展示了事件溯源与聚合根重建的思路。 - 事件总线 - Send() 自动实例化事件并触发 - Send(T e) 直接触发事件实例 - Register/UnRegister 提供监听与注销 - 简易事件 - 最小化实现,适合轻量事件场景 - 事件溯源与聚合根重建 - 事件存储:按流存储事件,定期创建快照 - 聚合根重建:从历史事件重建状态,清理未提交事件 ```mermaid flowchart TD Start(["事件发布"]) --> Persist["持久化事件(可选)"] Persist --> SyncHandlers["同步处理器列表"] Persist --> AsyncHandlers["异步处理器列表"] SyncHandlers --> HandleSync["逐个处理同步处理器"] AsyncHandlers --> CollectTasks["收集异步任务"] CollectTasks --> AwaitTasks["等待所有异步处理器完成"] HandleSync --> End(["完成"]) AwaitTasks --> End ``` **图表来源** - [EventBus.cs](file://GFramework.Core/events/EventBus.cs#L16-L54) - [EasyEvent.cs](file://GFramework.Core/events/EasyEvent.cs#L8-L39) - [advanced-patterns.md](file://docs/tutorials/advanced-patterns.md#L519-L690) **章节来源** - [EventBus.cs](file://GFramework.Core/events/EventBus.cs#L1-L55) - [EasyEvent.cs](file://GFramework.Core/events/EasyEvent.cs#L1-L39) - [EventBusTests.cs](file://GFramework.Core.Tests/events/EventBusTests.cs#L1-L85) - [advanced-patterns.md](file://docs/tutorials/advanced-patterns.md#L515-L690) ### 插件系统开发(模块化架构) GFramework 通过架构基类与模块基类实现模块化与动态加载。模块安装时注册生命周期钩子,参与架构阶段转换与组件初始化。 - 模块安装 - InstallModule:安装模块、注册生命周期钩子、调用模块 Install - 模块生命周期:OnArchitecturePhase、OnPhase - 架构阶段管理 - EnterPhase:验证阶段转换、通知阶段变更、通知阶段感知对象 - 初始化顺序:工具 → 模型 → 系统,按阶段推进 ```mermaid sequenceDiagram participant Arch as "架构" participant Mod as "模块" participant Hook as "生命周期钩子" Arch->>Mod : "Install(architecture)" Arch->>Hook : "RegisterLifecycleHook(hook)" Hook-->>Arch : "OnPhase(phase, architecture)" Arch->>Mod : "OnArchitecturePhase(phase)" ``` **图表来源** - [Architecture.cs](file://GFramework.Core/architecture/Architecture.cs#L38-L48) - [Architecture.cs](file://GFramework.Core/architecture/Architecture.cs#L216-L223) - [Architecture.cs](file://GFramework.Core/architecture/Architecture.cs#L189-L196) - [AbstractModule.cs](file://GFramework.Game/architecture/AbstractModule.cs#L16-L32) **章节来源** - [Architecture.cs](file://GFramework.Core/architecture/Architecture.cs#L1-L569) - [AbstractModule.cs](file://GFramework.Game/architecture/AbstractModule.cs#L1-L33) ### 状态机模式高级应用 GFramework 的状态机支持注册/注销状态、状态切换、历史记录与回退。状态机系统在状态切换时发送状态变更事件,便于监听与响应。 - 状态机核心能力 - Register/Unregister:注册与注销状态 - ChangeTo/CanChangeTo:切换与校验状态 - 历史记录:最大历史长度限制,GoBack 回退 - 回调:OnStateChanging/OnStateChanged/OnTransitionRejected - 状态机系统 - 上下文感知:为状态设置架构上下文 - 生命周期:Init/Destroy - 事件通知:状态切换时发送状态变更事件 - 游戏状态机系统 - IsIn():检查当前状态类型 - Get():获取当前状态实例 ```mermaid classDiagram class StateMachine { +Register(state) +Unregister() +ChangeTo() +CanChangeTo() +GoBack() +GetStateHistory() +GetPreviousState() +ClearHistory() #ChangeInternal(next) #ChangeInternalWithoutHistory(next) #OnStateChanging(from,to) #OnStateChanged(from,to) #OnTransitionRejected(from,to) } class StateMachineSystem { +SetContext(context) +GetContext() +Init() +Destroy() #ChangeInternal(next) } class GameStateMachineSystem { +IsIn() +Get() } StateMachineSystem --|> StateMachine GameStateMachineSystem --|> StateMachineSystem ``` **图表来源** - [StateMachine.cs](file://GFramework.Core/state/StateMachine.cs#L27-L276) - [StateMachineSystem.cs](file://GFramework.Core/state/StateMachineSystem.cs#L14-L96) - [GameStateMachineSystem.cs](file://GFramework.Game/state/GameStateMachineSystem.cs#L9-L26) **章节来源** - [StateMachine.cs](file://GFramework.Core/state/StateMachine.cs#L1-L276) - [StateMachineSystem.cs](file://GFramework.Core/state/StateMachineSystem.cs#L1-L96) - [GameStateMachineSystem.cs](file://GFramework.Game/state/GameStateMachineSystem.cs#L1-L26) - [StateMachineTests.cs](file://GFramework.Core.Tests/state/StateMachineTests.cs#L1-L444) ## 依赖关系分析 GFramework 的核心组件之间存在清晰的依赖关系与协作模式: - 架构基类依赖 IOC 容器与事件总线,统一管理模块、系统、模型与工具 - 命令/查询总线依赖抽象命令/查询基类,确保输入输出模型一致 - 事件总线与状态机系统通过事件进行解耦协作 - 游戏状态机系统继承状态机系统,扩展游戏场景的状态判断 ```mermaid graph TB Arch["架构基类"] --> IOC["IOC 容器"] Arch --> EB["事件总线"] Arch --> Sys["系统注册"] Arch --> Model["模型注册"] Arch --> Util["工具注册"] CmdBus["命令总线"] --> AbsCmd["抽象命令"] QryBus["查询总线"] --> AbsQry["抽象查询"] StateSys["状态机系统"] --> StateMachine["状态机"] GameSM["游戏状态机系统"] --> StateSys EB --> EasyEvt["简易事件"] ``` **图表来源** - [Architecture.cs](file://GFramework.Core/architecture/Architecture.cs#L72-L77) - [CommandBus.cs](file://GFramework.Core/command/CommandBus.cs#L9-L62) - [AbstractCommand.cs](file://GFramework.Core/command/AbstractCommand.cs#L11-L53) - [QueryBus.cs](file://GFramework.Core/query/QueryBus.cs#L8-L23) - [AbstractQuery.cs](file://GFramework.Core/query/AbstractQuery.cs#L11-L29) - [StateMachineSystem.cs](file://GFramework.Core/state/StateMachineSystem.cs#L14-L96) - [GameStateMachineSystem.cs](file://GFramework.Game/state/GameStateMachineSystem.cs#L9-L26) - [EventBus.cs](file://GFramework.Core/events/EventBus.cs#L8-L55) - [EasyEvent.cs](file://GFramework.Core/events/EasyEvent.cs#L8-L39) **章节来源** - [Architecture.cs](file://GFramework.Core/architecture/Architecture.cs#L1-L569) - [CommandBus.cs](file://GFramework.Core/command/CommandBus.cs#L1-L62) - [QueryBus.cs](file://GFramework.Core/query/QueryBus.cs#L1-L23) - [EventBus.cs](file://GFramework.Core/events/EventBus.cs#L1-L55) - [StateMachineSystem.cs](file://GFramework.Core/state/StateMachineSystem.cs#L1-L96) - [GameStateMachineSystem.cs](file://GFramework.Game/state/GameStateMachineSystem.cs#L1-L26) ## 性能考虑 - 命令/查询总线 - 同步命令建议在主线程执行,避免频繁切换线程上下文 - 异步命令优先使用 SendAsync,充分利用异步 I/O 与协程调度 - 输入输出模型尽量简单,减少序列化/反序列化成本 - 事件系统 - 事件处理器应避免长时间阻塞,必要时拆分为异步处理器 - 事件存储需考虑并发写入与快照策略,降低重放成本 - 状态机 - 历史记录大小受控,避免内存膨胀 - 状态切换回调应尽量轻量,避免在 OnStateChanging/OnStateChanged 中执行耗时操作 [本节为通用指导,无需列出章节来源] ## 故障排除指南 - 命令总线 - 空命令异常:确保传入的命令不为 null - 异步命令执行失败:检查异常捕获与日志记录,定位具体命令实现 - 查询总线 - 查询执行异常:检查查询输入参数与业务逻辑,确保 Do() 正确实现 - 事件总线 - 处理器未触发:确认事件类型匹配与处理器注册顺序 - 注销无效:确保注销的是同一委托实例 - 状态机 - 无法切换状态:检查 CanTransitionTo 与状态注册情况 - 回退失败:确认历史记录中仍存在有效状态 **章节来源** - [CommandBusTests.cs](file://GFramework.Core.Tests/command/CommandBusTests.cs#L48-L123) - [EventBusTests.cs](file://GFramework.Core.Tests/events/EventBusTests.cs#L28-L77) - [StateMachineTests.cs](file://GFramework.Core.Tests/state/StateMachineTests.cs#L132-L195) ## 结论 通过 CQRS、事件驱动与状态机三大模式,GFramework 为复杂游戏系统提供了清晰的架构骨架。结合模块化与上下文感知能力,开发者可以在保证可维护性的同时,实现高性能与高扩展性的系统设计。建议在实际项目中: - 明确命令/查询边界,使用输入输出模型约束参数 - 采用事件总线解耦模块,必要时引入事件溯源增强可观测性 - 善用状态机管理复杂状态流转,结合游戏状态机系统进行场景化扩展 [本节为总结性内容,无需列出章节来源] ## 附录 - 教程文档中的完整 CQRS 示例与 DDD 设计思路,可作为实战参考 - 单元测试覆盖命令总线、状态机与事件总线的关键行为,便于对照与扩展 **章节来源** - [advanced-patterns.md](file://docs/tutorials/advanced-patterns.md#L1-L800) - [CommandBusTests.cs](file://GFramework.Core.Tests/command/CommandBusTests.cs#L1-L265) - [StateMachineTests.cs](file://GFramework.Core.Tests/state/StateMachineTests.cs#L1-L444) - [EventBusTests.cs](file://GFramework.Core.Tests/events/EventBusTests.cs#L1-L85)