Skip to content

AutoRegisterModule 生成器

为架构模块生成固定顺序的组件注册代码,收敛 Install(IArchitecture) 样板。

概述

AutoRegisterModule 面向 GFramework 的模块安装场景。 当一个模块类只需要按固定顺序注册若干 ModelSystemUtility 时,开发者不必再手写重复的 Install(IArchitecture) 方法。

生成器会扫描类上的:

  • [AutoRegisterModule]
  • [RegisterModel(typeof(...))]
  • [RegisterSystem(typeof(...))]
  • [RegisterUtility(typeof(...))]

然后在编译期生成统一的安装方法。

核心收益

  • 把模块注册入口收敛到声明式 Attribute
  • 避免漏注册、顺序漂移和重复样板
  • 保持零运行时反射开销

基础使用

csharp
using GFramework.Core.Abstractions.Architectures;
using GFramework.Core.Abstractions.Model;
using GFramework.Core.Abstractions.Systems;
using GFramework.Core.Abstractions.Utility;
using GFramework.SourceGenerators.Abstractions.Architectures;

public sealed class RunStateModel : IModel
{
}

public sealed class BuildSystem : ISystem
{
}

public sealed class GridPathUtility : IUtility
{
}

[AutoRegisterModule]
[RegisterModel(typeof(RunStateModel))]
[RegisterSystem(typeof(BuildSystem))]
[RegisterUtility(typeof(GridPathUtility))]
public partial class GameplayModule
{
}

生成的代码

编译器会生成与下述结构等价的代码:

csharp
// <auto-generated />
#nullable enable

partial class GameplayModule
{
    public void Install(global::GFramework.Core.Abstractions.Architectures.IArchitecture architecture)
    {
        architecture.RegisterModel(new global::RunStateModel());
        architecture.RegisterSystem(new global::BuildSystem());
        architecture.RegisterUtility(new global::GridPathUtility());
    }
}

参数说明

[AutoRegisterModule]

类级标记,用于声明该类型允许生成 Install(IArchitecture)

[RegisterModel(typeof(TModel))]

参数类型说明
modelTypeType要注册的 IModel 实现类型

[RegisterSystem(typeof(TSystem))]

参数类型说明
systemTypeType要注册的 ISystem 实现类型

[RegisterUtility(typeof(TUtility))]

参数类型说明
utilityTypeType要注册的 IUtility 实现类型

顺序规则

生成器会按 Attribute 的稳定声明顺序输出注册语句。

  • 同一个 partial 声明内:按源码书写顺序生成
  • 多个 partial 文件之间:按语法树稳定顺序合并

这意味着模块安装顺序是可预期的,适合游戏启动时需要确定初始化顺序的场景。

适用场景

推荐用于:

  • 游戏主架构中的固定模块安装
  • 菜单模块、战斗模块、局内模块等声明式注册
  • 仅依赖无参构造即可完成初始化的组件

不推荐用于:

  • 需要运行时参数、配置对象或工厂参与构造的组件
  • 注册前必须执行复杂前置逻辑的模块
  • 注册逻辑本身存在分支、条件或环境判断的模块

使用约束

  • 目标类型必须是 partial class
  • 不支持嵌套类
  • 目标类型上不能自己再声明 Install(IArchitecture)
  • 注册类型必须是具体类型,不能是抽象类或接口
  • 注册类型必须实现对应接口:
    • RegisterModel 对应 IModel
    • RegisterSystem 对应 ISystem
    • RegisterUtility 对应 IUtility
  • 注册类型必须存在可访问的无参构造函数

诊断信息

诊断 ID含义
GF_Common_Class_001目标类型不是 partial,生成被跳过
GF_AutoModule_001AutoRegisterModule 不支持嵌套类
GF_AutoModule_002注册特性没有提供有效的具体类型参数
GF_AutoModule_003注册类型没有实现要求的接口
GF_AutoModule_004注册类型缺少可访问的无参构造
GF_AutoModule_005宿主类型已声明 Install(IArchitecture),与生成代码冲突

注意事项

  • 生成器只负责生成安装方法,不会自动调用它;模块仍需由你的架构启动逻辑显式执行。
  • 如果某个组件需要通过 Service、配置表或 Godot 导出字段来完成构造,优先保留手写注册代码。
  • 当注册逻辑已经包含较强的业务语义时,不要为了消灭几行代码而强行改成声明式生成。

相关文档

基于 Apache 2.0 许可证发布