GFramework/ai-plan/public/single-context-priority/todos/single-context-priority-tracking.md
gewuyou ee8b6a4deb fix(core): 修复上下文销毁解绑与并发一致性
- 修复 GameContext 的别名字典与当前活动上下文同步边界,避免解绑与读取路径出现状态漂移
- 修复 Architecture.Destroy() 缺少全局解绑的问题,并补充相关生命周期 XML 文档
- 更新回归测试、CQRS 注册断言与 single-context-priority 跟踪记录
2026-05-07 10:43:07 +08:00

5.1 KiB

Single Context Priority 跟踪

目标

围绕 GameContextMicrosoftDiContainer 收敛当前运行时语义:

  • GameContext 从弱约束的多上下文字典收敛为“单活动上下文 + 兼容别名查找”模型
  • 保留按架构类型查找的兼容入口,同时禁止在同一全局上下文表中并存多个不同的架构上下文实例
  • 统一 MicrosoftDiContainer 预冻结阶段的单实例读取路径,减少 RegisterPlurality / CQRS 基础设施别名注册下的查询歧义

当前恢复点

  • 恢复点编号:SINGLE-CONTEXT-PRIORITY-RP-003
  • 当前阶段:Phase 3
  • 当前结论:
    • GameContext 已从“字典首个枚举值即默认上下文”收敛为“单活动上下文 + 类型别名兼容查找”;同一全局上下文表不再允许并存两个不同上下文实例
    • MicrosoftDiContainer 的预冻结 Get<T>() / Get(Type) 已改为复用实例可见性收集逻辑,和 GetAll* 的实例暴露规则保持一致
    • IIocContainer XML 文档已明确预冻结查询与 Contains<T>() 的契约边界,避免把注册阶段查询误读为完整 DI 激活语义
    • Architecture.DestroyAsync() 现会在生命周期销毁完成后显式解除 GameContext 绑定,防止已销毁架构继续充当默认上下文回退入口
    • 当前 PR review 跟进中,Architecture.Destroy() 已补齐相同解绑语义,GameContext 也改为通过统一临界区维护别名字典与当前活动上下文的一致性
    • 当前分支从 main 创建,已完成 git pull --ff-only origin main

当前活跃事实

  • 当前分支:refactor/single-context-priority
  • 当前预期改动面:
    • GFramework.Core/Architectures/GameContext.cs
    • GFramework.Core/Rule/ContextAwareBase.cs
    • GFramework.Core/Ioc/MicrosoftDiContainer.cs
    • GFramework.Core.Abstractions/Ioc/IIocContainer.cs
    • 相关 GFramework.Core.Tests 与必要文档页

当前风险

  • GameContext 是公开静态入口,任何“允许多个不同上下文并存”的现有测试都需要按单活动上下文语义重写
  • Contains<T>() 在预冻结阶段目前更接近“是否存在注册”,不等同于“是否能立即解析实例”;本轮若不改其行为,需要在文档和测试中明确这一点
  • ResolveCqrsRegistrationService() 仍要求注册阶段对 ICqrsRegistrationService 可见的是实例绑定;若后续改成工厂或实现类型注册,需要额外设计注册阶段激活 helper
  • 现有解绑逻辑通过 Architecture.GetType() 移除初始化期绑定;若后续引入更多显式上下文别名,需同步评估是否要在销毁时额外移除这些别名
  • GameContext 当前通过粗粒度锁保护组合状态一致性;若该入口后续进入高频并发热点,需要基于真实性能数据再评估更细粒度方案

最近权威验证

  • git pull --ff-only origin main
    • 结果:通过,当前主分支已同步
  • rg -n "GetFirstArchitectureContext|GameContext|RegisterPlurality|ResolveCqrsRegistrationService|GetAll\\(" ...
    • 结果:已确认 GameContext 的默认回退集中在 ContextAwareBase / GameContextProvider,且 MicrosoftDiContainer 的预冻结查询实现存在分叉
  • python3 scripts/license-header.py --check
    • 结果:通过
  • dotnet test GFramework.Core.Tests/GFramework.Core.Tests.csproj -c Release --filter "FullyQualifiedName~GameContextTests|FullyQualifiedName~ContextProviderTests|FullyQualifiedName~ContextAwareTests|FullyQualifiedName~MicrosoftDiContainerTests|FullyQualifiedName~IocContainerLifetimeTests|FullyQualifiedName~ArchitectureInitializationPipelineTests"
    • 结果:通过,92/92 passed
  • dotnet build GFramework.Core/GFramework.Core.csproj -c Release
    • 结果:通过,0 warning / 0 error
  • dotnet test GFramework.Core.Tests/GFramework.Core.Tests.csproj -c Release --filter "FullyQualifiedName~ArchitectureLifecycleBehaviorTests|FullyQualifiedName~SyncArchitectureTests|FullyQualifiedName~AsyncArchitectureTests|FullyQualifiedName~ArchitectureInitializationPipelineTests|FullyQualifiedName~ContextAwareTests"
    • 结果:通过,32/32 passed
  • dotnet build GFramework.Core/GFramework.Core.csproj -c Release
    • 结果:再次通过,0 warning / 0 error
  • python3 scripts/license-header.py --check
    • 结果:再次通过,所有受支持文件头合法
  • dotnet test GFramework.Core.Tests/GFramework.Core.Tests.csproj -c Release --filter "FullyQualifiedName~GameContextTests|FullyQualifiedName~ContextProviderTests|FullyQualifiedName~ContextAwareTests|FullyQualifiedName~ArchitectureLifecycleBehaviorTests|FullyQualifiedName~MicrosoftDiContainerTests"
    • 结果:通过,87/87 passed
  • dotnet build GFramework.Core/GFramework.Core.csproj -c Release
    • 结果:再次通过,0 warning / 0 error

下一推荐步骤

  1. 若后续继续推进,可评估是否要把 GameContext.ArchitectureReadOnlyDictionary 标记为兼容层,并收口其公开使用面
  2. GameContext 的组合锁成为瓶颈,再基于压测结果讨论更细粒度的原子状态模型
  3. 若 CQRS runtime seam 计划改成工厂式注册,再单独补“注册阶段激活 helper”的设计与测试