diff --git a/GFramework.Core.Abstractions/enums/ArchitecturePhase.cs b/GFramework.Core.Abstractions/enums/ArchitecturePhase.cs index a46310c..93b2aa3 100644 --- a/GFramework.Core.Abstractions/enums/ArchitecturePhase.cs +++ b/GFramework.Core.Abstractions/enums/ArchitecturePhase.cs @@ -14,6 +14,16 @@ public enum ArchitecturePhase /// None = 0, + /// + /// 工具类初始化之前阶段 + /// + BeforeUtilityInit, + + /// + /// 工具类初始化之后阶段 + /// + AfterUtilityInit, + /// /// 模型初始化之前阶段 /// diff --git a/GFramework.Core.Tests/tests/AsyncArchitectureTests.cs b/GFramework.Core.Tests/tests/AsyncArchitectureTests.cs index a29c190..de86f7b 100644 --- a/GFramework.Core.Tests/tests/AsyncArchitectureTests.cs +++ b/GFramework.Core.Tests/tests/AsyncArchitectureTests.cs @@ -60,6 +60,8 @@ public class AsyncArchitectureTests : ArchitectureTestsBase CollectionAssert.AreEqual( new[] { + ArchitecturePhase.BeforeUtilityInit, + ArchitecturePhase.AfterUtilityInit, ArchitecturePhase.BeforeModelInit, ArchitecturePhase.AfterModelInit, ArchitecturePhase.BeforeSystemInit, diff --git a/GFramework.Core/architecture/Architecture.cs b/GFramework.Core/architecture/Architecture.cs index 93ec98d..7cf2b92 100644 --- a/GFramework.Core/architecture/Architecture.cs +++ b/GFramework.Core/architecture/Architecture.cs @@ -110,6 +110,12 @@ public abstract class Architecture( /// private readonly HashSet _allSystems = []; + /// + /// 存储尚未初始化的上下文工具集合 + /// + private readonly HashSet _mContextUtilities = []; + + /// /// 标记架构是否已初始化完成 /// @@ -328,6 +334,19 @@ public abstract class Architecture( _logger.Debug("Calling user Init()"); Init(); _logger.Debug("User Init() completed"); + // === Context Utility 初始化阶段 === + EnterPhase(ArchitecturePhase.BeforeUtilityInit); + _logger.Info($"Initializing {_mContextUtilities.Count} context utilities"); + + foreach (var utility in _mContextUtilities) + { + _logger.Debug($"Initializing context utility: {utility.GetType().Name}"); + utility.Init(); + } + + _mContextUtilities.Clear(); + EnterPhase(ArchitecturePhase.AfterUtilityInit); + _logger.Info("All context utilities initialized"); // === 模型初始化阶段 === // 在此阶段初始化所有注册的模型组件 @@ -447,7 +466,20 @@ public abstract class Architecture( public void RegisterUtility(TUtility utility) where TUtility : IUtility { _logger.Debug($"Registering utility: {typeof(TUtility).Name}"); - utility.IfType(contextUtility => { contextUtility.SetContext(Context); }); + utility.IfType(contextUtility => + { + contextUtility.SetContext(Context); + + if (!_mInitialized) + { + _mContextUtilities.Add(contextUtility); + } + else + { + _logger.Trace($"Immediately initializing context utility: {typeof(TUtility).Name}"); + contextUtility.Init(); + } + }); Container.RegisterPlurality(utility); _logger.Info($"Utility registered: {typeof(TUtility).Name}"); } diff --git a/GFramework.Core/architecture/ArchitectureConstants.cs b/GFramework.Core/architecture/ArchitectureConstants.cs index e187ee4..f81d2b5 100644 --- a/GFramework.Core/architecture/ArchitectureConstants.cs +++ b/GFramework.Core/architecture/ArchitectureConstants.cs @@ -17,7 +17,15 @@ public static class ArchitectureConstants public static readonly ImmutableDictionary PhaseTransitions = new Dictionary { - { ArchitecturePhase.None, [ArchitecturePhase.BeforeModelInit] }, + { ArchitecturePhase.None, [ArchitecturePhase.BeforeUtilityInit] }, + { + ArchitecturePhase.BeforeUtilityInit, + [ArchitecturePhase.AfterUtilityInit, ArchitecturePhase.FailedInitialization] + }, + { + ArchitecturePhase.AfterUtilityInit, + [ArchitecturePhase.BeforeModelInit, ArchitecturePhase.FailedInitialization] + }, { ArchitecturePhase.BeforeModelInit, [ ArchitecturePhase.AfterModelInit, ArchitecturePhase.FailedInitialization