refactor(architecture): 重构抽象架构类的初始化和锚点管理

- 添加架构配置、服务和上下文依赖注入支持
- 将静态架构锚点名称改为动态实例字段
- 实现基于类型名称和哈希码的唯一锚点命名机制
- 更新锚点创建和生命周期绑定逻辑
- 移除硬编码的常量名称,提高架构实例唯一性
This commit is contained in:
GwWuYou 2026-01-01 22:58:56 +08:00
parent 2f5af5c067
commit 45ba75c0ad

View File

@ -1,4 +1,5 @@
using GFramework.Core.architecture;
using GFramework.Core.Abstractions.architecture;
using GFramework.Core.architecture;
using GFramework.Core.constants;
using GFramework.Godot.extensions;
using Godot;
@ -9,14 +10,12 @@ namespace GFramework.Godot.architecture;
/// 抽象架构类,为特定类型的架构提供基础实现框架。
/// 此类负责管理架构的初始化、生命周期绑定以及扩展模块的安装与销毁。
/// </summary>
public abstract class AbstractArchitecture : Architecture
public abstract class AbstractArchitecture(
IArchitectureConfiguration? configuration = null,
IArchitectureServices? services = null,
IArchitectureContext? context = null
) : Architecture(configuration, services, context)
{
/// <summary>
/// 架构锚点节点的唯一标识名称
/// 用于在Godot场景树中创建和查找架构锚点节点
/// </summary>
private const string ArchitectureAnchorName = $"__{GFrameworkConstants.FrameworkName}__ArchitectureAnchor__";
/// <summary>
/// 存储所有已安装的Godot架构扩展组件列表
/// 用于在架构销毁时正确清理所有扩展资源
@ -29,6 +28,12 @@ public abstract class AbstractArchitecture : Architecture
/// </summary>
private ArchitectureAnchor? _anchor;
/// <summary>
/// 架构锚点节点的唯一标识名称
/// 用于在Godot场景树中创建和查找架构锚点节点
/// </summary>
private string _architectureAnchorName = null!;
/// <summary>
/// 标记架构是否已被销毁的状态标志
/// 用于防止架构被重复销毁,确保资源清理只执行一次
@ -48,6 +53,8 @@ public abstract class AbstractArchitecture : Architecture
/// </summary>
protected override void Init()
{
_architectureAnchorName =
$"__{GFrameworkConstants.FrameworkName}__{GetType().Name}__{GetHashCode()}__ArchitectureAnchor__";
AttachToGodotLifecycle();
InstallModules();
}
@ -68,12 +75,12 @@ public abstract class AbstractArchitecture : Architecture
return;
// 防止重复挂载(热重载 / 多次 Init
if (tree.Root.GetNodeOrNull(ArchitectureAnchorName) != null)
if (tree.Root.GetNodeOrNull(_architectureAnchorName) != null)
return;
_anchor = new ArchitectureAnchor
{
Name = ArchitectureAnchorName
Name = _architectureAnchorName
};
_anchor.Bind(Destroy);