跳转至

声明式装配与工厂

1.9.1 起,Installer 与 NodeContext 可以使用声明式装配器。

典型流程

func install_bindings(binder: Variant) -> void:
    if not binder is GFBinder:
        return

    _register_project_bindings(binder)


func _register_project_bindings(binder: GFBinder) -> void:
    binder.bind_model(PlayerModel).as_singleton()
    binder.bind_utility(JSONConfigProvider).with_alias(GFConfigProvider).as_singleton()
    binder.bind_factory(DealDamageCommand).from_factory(func() -> Object:
        return DealDamageCommand.new()
    ).as_transient()

声明式装配不会替代原有 register_model_instance()register_system_instance()register_utility_instance()。它只是把“绑定来源、别名和生命周期”集中写清楚,适合大型项目或插件式模块。

核心类

声明式装配器由 GFBinderGFBindBuilder 提供:GFBinder 是传给 Installer 的入口对象,负责创建 bind_model()bind_system()bind_utility()bind_factory() 这些绑定链;这些入口会返回明确的 GFBindBuilder,由 Builder 承接 .from_factory().from_instance().with_alias().as_singleton().as_transient() 等声明。

GFInstaller.install_bindings() 的协议参数仍是 Variant,因为它是框架生命周期钩子;项目代码进入声明式链之前应先收窄为 GFBinder,之后就可以保持完整的类型提示和补全。

使用边界

ModelSystemUtility 都是生命周期模块,只支持单例式注册;as_transient() 只适合短生命周期工厂对象,.with_alias() 也只对生命周期模块生效。

对于不需要进入生命周期的短生命周期对象,GFArchitecture 提供轻量工厂能力。详细注册、生命周期和父子架构回退规则见 生命周期、装配与依赖

工厂适合 Command、Query、技能执行载体等一次性对象,不建议用于需要参与 init()tick()dispose() 的长期模块。

当子架构回退到父级工厂时,transient 工厂创建的对象会注入发起解析的子架构,从而优先访问当前局部上下文。

singleton 工厂仍由拥有该绑定的架构持有和注入,并在工厂替换、注销或架构销毁时清理缓存实例的 owner 事件监听、调用 dispose()(如果存在)和释放依赖作用域。