跳转至

依赖诊断

GFArchitecture.get_dependency_diagnostics() 可读取已注册模块的可选依赖声明,并生成统一报告。它适合大型项目、局部 GFNodeContext 或插件式装配在初始化前后检查“模块声明需要什么、当前架构是否已经注册”。

诊断只读,不会自动注册缺失模块,也不会改变 get_model()get_system()get_utility() 和工厂创建的现有语义。

依赖声明

模块可按需实现这些 hook:

func get_required_models() -> Array[Script]:
    return [PlayerModel]

func get_required_utilities() -> Array[Script]:
    return [InventoryConfigUtility]

func get_required_dependencies() -> Dictionary:
    return {
        "systems": [BattleSystem],
        "factories": [DealDamageCommand],
    }

诊断调用

var report := architecture.get_dependency_diagnostics({
    "include_parent_lookup": true,
    "include_factories": true,
})
if not report["ok"]:
    for issue in report["issues"]:
        push_warning(issue["message"])

绑定图诊断

get_dependency_diagnostics() 面向“模块声明的依赖是否满足”。如果需要排查当前架构实际注册了什么、别名是否指向有效目标、工厂是什么生命周期、scoped 架构会回退到哪些父级,可以读取 get_binding_diagnostics()

var bindings := architecture.get_binding_diagnostics({
    "include_entries": true,
    "include_parent_chain": true,
})

for issue in bindings["issues"]:
    push_warning(issue["message"])

绑定图诊断同样只读,不会触发工厂实例化,也不会调用 get_model() / get_utility() 这类查询入口。它适合编辑器面板、调试命令、局部 GFNodeContext 自检和测试断言。

父级架构链会通过 visited guard 遍历。正常入口 set_parent_architecture() 会拒绝自引用和循环引用;如果内部状态被维护代码或测试辅助破坏,运行时父级查找会停止并输出错误,get_binding_diagnostics() 会返回 parent_chain_cycle_detected=trueparent_chain_cycle issue。get_dependency_diagnostics() 在解析声明式依赖时遇到同类腐坏链,会使用 dependency_parent_chain_cycle,避免把父链循环误读成普通缺失依赖。

使用边界

依赖声明应保持抽象和稳定,优先声明模块真正需要的接口脚本、基类或别名类型;不要把具体关卡、敌人、UI 页面或临时玩法条件写进通用模块 hook。

需要按玩家进度、DLC、服务器配置或场景状态动态判断的内容,应留在项目自己的装配流程或诊断命令里。