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