using GFramework.Core.Abstractions.Architectures;
using GFramework.Core.Abstractions.Enums;
using GFramework.Core.Abstractions.Lifecycle;
using GFramework.Core.Abstractions.Logging;
using GFramework.Core.Abstractions.Model;
using GFramework.Core.Abstractions.Systems;
using GFramework.Core.Abstractions.Utility;
namespace GFramework.Core.Architectures;
///
/// 架构生命周期管理器
/// 负责管理架构的阶段转换、组件初始化和销毁
///
internal sealed class ArchitectureLifecycle(
IArchitecture architecture,
IArchitectureConfiguration configuration,
IArchitectureServices services,
ILogger logger)
{
#region Lifecycle Hook Management
///
/// 注册生命周期钩子
///
/// 生命周期钩子实例
/// 注册的钩子实例
public IArchitectureLifecycleHook RegisterLifecycleHook(IArchitectureLifecycleHook hook)
{
if (CurrentPhase >= ArchitecturePhase.Ready && !configuration.ArchitectureProperties.AllowLateRegistration)
throw new InvalidOperationException(
"Cannot register lifecycle hook after architecture is Ready");
_lifecycleHooks.Add(hook);
return hook;
}
#endregion
#region Component Lifecycle Management
///
/// 统一的组件生命周期注册逻辑
///
/// 要注册的组件
public void RegisterLifecycleComponent(object component)
{
// 处理初始化
if (component is IInitializable initializable)
{
if (!_initialized)
{
// 原子去重:HashSet.Add 返回 true 表示添加成功(之前不存在)
if (_pendingInitializableSet.Add(initializable))
{
_pendingInitializableList.Add(initializable);
logger.Trace($"Added {component.GetType().Name} to pending initialization queue");
}
}
else
{
throw new InvalidOperationException(
"Cannot initialize component after Architecture is Ready");
}
}
// 处理销毁(支持 IDestroyable 或 IAsyncDestroyable)
if (component is not (IDestroyable or IAsyncDestroyable)) return;
// 原子去重:HashSet.Add 返回 true 表示添加成功(之前不存在)
if (!_disposableSet.Add(component)) return;
_disposables.Add(component);
logger.Trace($"Registered {component.GetType().Name} for destruction");
}
#endregion
#region Fields
private readonly TaskCompletionSource _readyTcs = new(TaskCreationOptions.RunContinuationsAsynchronously);
///
/// 待初始化组件的去重集合
///
private readonly HashSet _pendingInitializableSet = [];
///
/// 存储所有待初始化的组件(统一管理,保持注册顺序)
///
private readonly List _pendingInitializableList = [];
///
/// 可销毁组件的去重集合(支持 IDestroyable 和 IAsyncDestroyable)
///
private readonly HashSet