feat(architecture): 添加上下文工具初始化阶段支持

- 在架构中新增 _mContextUtilities 集合存储未初始化的上下文工具
- 实现工具注册时根据初始化状态决定是否立即初始化上下文工具
- 添加 BeforeUtilityInit 和 AfterUtilityInit 两个新的架构阶段
- 更新架构阶段转换配置以支持工具初始化流程
- 在同步和异步架构测试中验证新的初始化阶段序列
- 完善架构初始化流程日志记录和调试信息
This commit is contained in:
GwWuYou 2026-01-07 21:16:43 +08:00
parent 0766416f83
commit e000665c67
5 changed files with 56 additions and 2 deletions

View File

@ -14,6 +14,16 @@ public enum ArchitecturePhase
/// </summary>
None = 0,
/// <summary>
/// 工具类初始化之前阶段
/// </summary>
BeforeUtilityInit,
/// <summary>
/// 工具类初始化之后阶段
/// </summary>
AfterUtilityInit,
/// <summary>
/// 模型初始化之前阶段
/// </summary>

View File

@ -60,6 +60,8 @@ public class AsyncArchitectureTests : ArchitectureTestsBase<AsyncTestArchitectur
CollectionAssert.AreEqual(
new[]
{
ArchitecturePhase.BeforeUtilityInit,
ArchitecturePhase.AfterUtilityInit,
ArchitecturePhase.BeforeModelInit,
ArchitecturePhase.AfterModelInit,
ArchitecturePhase.BeforeSystemInit,

View File

@ -76,6 +76,8 @@ public class SyncArchitectureTests : ArchitectureTestsBase<SyncTestArchitecture>
CollectionAssert.AreEqual(
new[]
{
ArchitecturePhase.BeforeUtilityInit,
ArchitecturePhase.AfterUtilityInit,
ArchitecturePhase.BeforeModelInit,
ArchitecturePhase.AfterModelInit,
ArchitecturePhase.BeforeSystemInit,

View File

@ -110,6 +110,12 @@ public abstract class Architecture(
/// </summary>
private readonly HashSet<ISystem> _allSystems = [];
/// <summary>
/// 存储尚未初始化的上下文工具集合
/// </summary>
private readonly HashSet<IContextUtility> _mContextUtilities = [];
/// <summary>
/// 标记架构是否已初始化完成
/// </summary>
@ -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>(TUtility utility) where TUtility : IUtility
{
_logger.Debug($"Registering utility: {typeof(TUtility).Name}");
utility.IfType<IContextUtility>(contextUtility => { contextUtility.SetContext(Context); });
utility.IfType<IContextUtility>(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}");
}

View File

@ -17,7 +17,15 @@ public static class ArchitectureConstants
public static readonly ImmutableDictionary<ArchitecturePhase, ArchitecturePhase[]> PhaseTransitions =
new Dictionary<ArchitecturePhase, ArchitecturePhase[]>
{
{ 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