From e000665c67790c3268a26effa794723518efdae4 Mon Sep 17 00:00:00 2001
From: GwWuYou <95328647+GeWuYou@users.noreply.github.com>
Date: Wed, 7 Jan 2026 21:16:43 +0800
Subject: [PATCH] =?UTF-8?q?feat(architecture):=20=E6=B7=BB=E5=8A=A0?=
=?UTF-8?q?=E4=B8=8A=E4=B8=8B=E6=96=87=E5=B7=A5=E5=85=B7=E5=88=9D=E5=A7=8B?=
=?UTF-8?q?=E5=8C=96=E9=98=B6=E6=AE=B5=E6=94=AF=E6=8C=81?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
- 在架构中新增 _mContextUtilities 集合存储未初始化的上下文工具
- 实现工具注册时根据初始化状态决定是否立即初始化上下文工具
- 添加 BeforeUtilityInit 和 AfterUtilityInit 两个新的架构阶段
- 更新架构阶段转换配置以支持工具初始化流程
- 在同步和异步架构测试中验证新的初始化阶段序列
- 完善架构初始化流程日志记录和调试信息
---
.../enums/ArchitecturePhase.cs | 10 ++++++
.../tests/AsyncArchitectureTests.cs | 2 ++
.../tests/SyncArchitectureTests.cs | 2 ++
GFramework.Core/architecture/Architecture.cs | 34 ++++++++++++++++++-
.../architecture/ArchitectureConstants.cs | 10 +++++-
5 files changed, 56 insertions(+), 2 deletions(-)
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