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) { return _phaseCoordinator.RegisterLifecycleHook(hook); } #endregion #region Component Lifecycle Management /// /// 统一的组件生命周期注册逻辑 /// /// 要注册的组件 public void RegisterLifecycleComponent(object component) { if (component is IInitializable initializable) { if (_initialized) { if (!configuration.ArchitectureProperties.AllowLateRegistration) throw new InvalidOperationException("Cannot initialize component after Architecture is Ready"); InitializeLateRegisteredComponent(initializable); } else if (_pendingInitializableSet.Add(initializable)) { _pendingInitializableList.Add(initializable); logger.Trace($"Added {component.GetType().Name} to pending initialization queue"); } } _disposer.Register(component); } #endregion #region Phase Management /// /// 进入指定的架构阶段,并执行相应的生命周期管理操作 /// /// 要进入的下一个架构阶段 public void EnterPhase(ArchitecturePhase next) { _phaseCoordinator.EnterPhase(next); PhaseChanged?.Invoke(this, new ArchitecturePhaseChangedEventArgs(next)); } #endregion #region Fields private readonly TaskCompletionSource _readyTcs = new(TaskCreationOptions.RunContinuationsAsynchronously); /// /// 待初始化组件的去重集合 /// private readonly HashSet _pendingInitializableSet = []; /// /// 存储所有待初始化的组件(统一管理,保持注册顺序) /// private readonly List _pendingInitializableList = []; /// /// 架构阶段协调器 /// private readonly ArchitecturePhaseCoordinator _phaseCoordinator = new(architecture, configuration, services, logger); /// /// 架构销毁协调器 /// private readonly ArchitectureDisposer _disposer = new(services, logger); /// /// 标记架构是否已初始化完成 /// private bool _initialized; #endregion #region Properties /// /// 当前架构的阶段 /// public ArchitecturePhase CurrentPhase => _phaseCoordinator.CurrentPhase; /// /// 获取一个布尔值,指示当前架构是否处于就绪状态 /// public bool IsReady => CurrentPhase == ArchitecturePhase.Ready; /// /// 获取一个布尔值,指示架构是否已初始化 /// public bool IsInitialized => _initialized; /// /// 阶段变更事件(用于测试和扩展) /// public event EventHandler? PhaseChanged; #endregion #region Initialization /// /// 初始化所有待初始化的组件 /// /// 是否使用异步模式 public async Task InitializeAllComponentsAsync(bool asyncMode) { logger.Info($"Initializing {_pendingInitializableList.Count} components"); var initializationPlan = CreateInitializationPlan(); await InitializePhaseComponentsAsync( initializationPlan.Utilities, ArchitecturePhase.BeforeUtilityInit, ArchitecturePhase.AfterUtilityInit, "context utilities", "utility", asyncMode) .ConfigureAwait(false); await InitializePhaseComponentsAsync( initializationPlan.Models, ArchitecturePhase.BeforeModelInit, ArchitecturePhase.AfterModelInit, "models", "model", asyncMode) .ConfigureAwait(false); await InitializePhaseComponentsAsync( initializationPlan.Systems, ArchitecturePhase.BeforeSystemInit, ArchitecturePhase.AfterSystemInit, "systems", "system", asyncMode) .ConfigureAwait(false); MarkInitializationCompleted(); } /// /// 异步初始化单个组件 /// /// 要初始化的组件 /// 是否使用异步模式 private static async Task InitializeComponentAsync(IInitializable component, bool asyncMode) { if (asyncMode && component is IAsyncInitializable asyncInit) await asyncInit.InitializeAsync().ConfigureAwait(false); else component.Initialize(); } /// /// 按架构既有阶段语义把待初始化组件拆分为 utility、model 和 system 三个批次。 /// 这样可以在压缩主流程复杂度的同时,继续复用注册顺序和接口类型决定的初始化分层。 /// /// 当前待初始化组件的阶段化批次。 private InitializationPlan CreateInitializationPlan() { return new InitializationPlan( _pendingInitializableList.OfType().ToList(), _pendingInitializableList.OfType().ToList(), _pendingInitializableList.OfType().ToList()); } /// /// 执行单个生命周期阶段的批量初始化,并统一维护阶段切换、日志输出和异步初始化策略。 /// /// 当前阶段要初始化的组件类型。 /// 当前阶段的组件列表。 /// 阶段开始前要进入的生命周期状态。 /// 阶段结束后要进入的生命周期状态。 /// 用于批量日志的组件组名称。 /// 用于单个组件日志的组件角色名称。 /// 是否允许优先走异步初始化契约。 private async Task InitializePhaseComponentsAsync( IReadOnlyList components, ArchitecturePhase beforePhase, ArchitecturePhase afterPhase, string componentGroupName, string componentLogName, bool asyncMode) where TComponent : class, IInitializable { EnterPhase(beforePhase); if (components.Count != 0) { logger.Info($"Initializing {components.Count} {componentGroupName}"); foreach (var component in components) { logger.Debug($"Initializing {componentLogName}: {component.GetType().Name}"); await InitializeComponentAsync(component, asyncMode).ConfigureAwait(false); } logger.Info($"All {componentGroupName} initialized"); } EnterPhase(afterPhase); } /// /// 在所有阶段初始化完成后清理挂起列表,并把生命周期状态切换到“已初始化”。 /// private void MarkInitializationCompleted() { _pendingInitializableList.Clear(); _pendingInitializableSet.Clear(); _initialized = true; logger.Info("All components initialized"); } /// /// 立即初始化在常规初始化批次完成后新增的组件。 /// 当启用 AllowLateRegistration 时,生命周期层需要和注册层保持一致, /// 让新增组件在注册当下完成同步初始化,而不是停留在未初始化状态。 /// /// 后注册的可初始化组件。 private void InitializeLateRegisteredComponent(IInitializable component) { logger.Debug($"Initializing late-registered component: {component.GetType().Name}"); component.Initialize(); } #endregion #region Destruction /// /// 异步销毁架构及所有组件 /// public async ValueTask DestroyAsync() { await _disposer.DestroyAsync(CurrentPhase, EnterPhase).ConfigureAwait(false); } /// /// 销毁架构并清理所有组件资源(同步方法,保留用于向后兼容) /// [Obsolete("建议使用 DestroyAsync() 以支持异步清理")] public void Destroy() { DestroyAsync().AsTask().GetAwaiter().GetResult(); } #endregion /// /// 保存一次完整初始化流程所需的三个阶段批次。 /// /// Utility 初始化批次。 /// Model 初始化批次。 /// System 初始化批次。 private readonly record struct InitializationPlan( IReadOnlyList Utilities, IReadOnlyList Models, IReadOnlyList Systems); #region Ready State /// /// 标记架构为就绪状态 /// public void MarkAsReady() { EnterPhase(ArchitecturePhase.Ready); _readyTcs.TrySetResult(); } /// /// 标记架构初始化失败 /// /// 失败异常 public void MarkAsFailed(Exception exception) { EnterPhase(ArchitecturePhase.FailedInitialization); _readyTcs.TrySetException(exception); } /// /// 等待架构就绪 /// public Task WaitUntilReadyAsync() => _readyTcs.Task; #endregion }