GeWuYou 2cfa78b91d feat(architecture): 添加架构阶段感知能力支持
- 在AbstractModel和AbstractSystem中添加OnArchitecturePhase虚方法实现
- 修改Architecture类移除IArchitectureLifecycle接口和OnPhase方法
- 更新IModel和ISystem接口继承IArchitecturePhaseAware接口
- 修改AbstractResourceFactorySystem实现IArchitecturePhaseAware接口
- 在测试类TestModel和TestSystem中添加OnArchitecturePhase方法实现
- 在项目文件中添加对生成器相关目录的排除配置
- 将ArchitecturePhase枚举引入到相关文件中
2025-12-31 12:42:06 +08:00
..

Architecture 包使用说明

概述

Architecture 包是整个框架的核心,提供了基于 MVC 架构模式的应用程序架构基础。它实现了依赖注入IoC容器、组件生命周期管理以及命令、查询、事件的统一调度机制。

核心类

1. IArchitecture

架构接口,定义了框架的核心功能契约。

主要职责:

  • 组件注册:注册 System、Model、Utility
  • 组件获取:从容器中获取已注册的组件
  • 命令处理:发送并执行命令
  • 查询处理:发送并执行查询
  • 事件管理:发送、注册、注销事件

核心方法:

// 注册组件
void RegisterSystem<T>(T system) where T : ISystem;
void RegisterModel<T>(T model) where T : IModel;
void RegisterUtility<T>(T utility) where T : IUtility;

// 获取组件
T GetSystem<T>() where T : class, ISystem;
T GetModel<T>() where T : class, IModel;
T GetUtility<T>() where T : class, IUtility;

// 命令处理
void SendCommand<T>(T command) where T : ICommand;
TResult SendCommand<TResult>(ICommand<TResult> command);

// 查询处理
TResult SendQuery<TResult>(IQuery<TResult> query);

// 事件管理
void SendEvent<T>() where T : new();
void SendEvent<T>(T e);
IUnRegister RegisterEvent<T>(Action<T> onEvent);
void UnRegisterEvent<T>(Action<T> onEvent);

2. Architecture<T>

架构基类,实现了 IArchitecture 接口,提供完整的架构功能实现。

特性:

  • 单例模式:使用泛型和 Lazy<T> 确保全局唯一实例
  • 线程安全:采用 LazyThreadSafetyMode.ExecutionAndPublication 保证多线程安全
  • 生命周期管理:自动管理 System 和 Model 的初始化顺序
  • IoC 容器:内置依赖注入容器,管理所有组件实例
  • 事件系统:集成类型化事件系统,支持类型安全的事件通信

初始化流程:

  1. 创建架构实例
  2. 调用用户自定义的 Init() 方法
  3. 执行注册的补丁逻辑(OnRegisterPatch
  4. 初始化所有已注册的 Model
  5. 初始化所有已注册的 System
  6. 标记初始化完成

使用示例:

// 1. 定义你的架构
public class GameArchitecture : Architecture<GameArchitecture>
{
    protected override void Init()
    {
        // 注册 Model
        RegisterModel(new PlayerModel());
        RegisterModel(new InventoryModel());
        
        // 注册 System
        RegisterSystem(new GameplaySystem());
        RegisterSystem(new SaveSystem());
        
        // 注册 Utility
        RegisterUtility(new StorageUtility());
        RegisterUtility(new TimeUtility());
    }
}

// 2. 在其他地方使用架构
public class GameController : IController
{
    private IArchitecture _architecture;
    
    public IArchitecture GetArchitecture() => GameArchitecture.Interface;
    
    public void Start()
    {
        // 获取 Model
        var playerModel = this.GetModel<PlayerModel>();
        
        // 发送命令
        this.SendCommand<StartGameCommand>();
        
        // 发送查询
        var score = this.SendQuery(new GetScoreQuery());
        
        // 注册事件
        this.RegisterEvent<PlayerDiedEvent>(OnPlayerDied);
    }
    
    private void OnPlayerDied(PlayerDiedEvent e)
    {
        // 处理玩家死亡事件
    }
}

高级特性:

// 动态扩展架构(补丁系统)
Architecture<GameArchitecture>.OnRegisterPatch += arch =>
{
    // 在架构初始化完成前注入额外逻辑
    arch.RegisterSystem(new DebugSystem());
};

// 在运行时动态注册组件(初始化后)
var newSystem = new DynamicSystem();
GameArchitecture.Interface.RegisterSystem(newSystem);
// newSystem.Init() 会被立即调用

设计模式

单例模式

通过泛型约束和 Lazy<T> 实现类型安全的单例。

依赖注入IoC

使用内置 IoC 容器管理组件生命周期和依赖关系。

命令模式

通过 ICommand 封装所有用户操作。

查询模式CQRS

通过 IQuery<T> 分离查询和命令操作。

观察者模式

通过事件系统实现组件间的松耦合通信。

最佳实践

  1. 保持架构类简洁:只在 Init() 中注册组件,不要包含业务逻辑
  2. 合理划分职责
    • Model数据和状态
    • System业务逻辑和规则
    • Utility无状态的工具方法
  3. 使用接口访问:通过 Interface 属性访问架构,便于测试
  4. 事件命名规范:使用过去式命名事件类,如 PlayerDiedEvent
  5. 避免循环依赖System 不应直接引用 System应通过事件通信

相关包


许可证: Apache 2.0