GFramework/ai-plan/public/single-context-priority/traces/single-context-priority-trace.md
gewuyou ff04a4fbad fix(core): 补齐架构销毁后的上下文解绑
- 修复 Architecture 销毁后 GameContext 仍保留活动上下文的问题

- 补充生命周期回归测试并验证失败初始化后的解绑路径

- 收口生成器文档中的多架构表述并更新 ai-plan 追踪
2026-05-07 10:03:16 +08:00

4.2 KiB
Raw Blame History

Single Context Priority 追踪

2026-05-07

阶段启动并收敛实现方向SINGLE-CONTEXT-PRIORITY-RP-001

  • 依据用户补充的运行时心智模型,确认当前 Architecture 更接近框架实例,IArchitectureContext 更接近功能入口,而不是需要并存运行的独立宿主
  • 启动阶段已按仓库规则读取 AGENTS.md.ai/environment/tools.ai.yamlai-plan/public/README.md,并在 main 上执行 git pull --ff-only origin main 后创建 refactor/single-context-priority
  • 本轮实现决策:
    • GameContext 维持兼容 API但内部收敛为单活动上下文模型允许多个类型键指向同一上下文实例不允许并存多个不同上下文实例
    • MicrosoftDiContainer 先做低风险修复:统一预冻结 Get<T>() / Get(Type) 的实例可见性规则,并把 CQRS 注册服务解析改为复用同一条实例收集路径
    • Contains<T>() 的预冻结语义仍保持“是否已有注册”,则通过 XML 文档和测试显式记录,而不是隐含为“可立即解析”
  • 本轮委托记录:
    • explorer Noether:梳理 GameContext 单活动上下文收敛的兼容风险、测试缺口和必须保留的 API 面
    • explorer Boole:梳理 MicrosoftDiContainer 预冻结查询、Contains<T>()、CQRS 注册依赖点的语义分叉

阶段实现与验证完成SINGLE-CONTEXT-PRIORITY-RP-001

  • 实现摘要:
    • GameContext 新增单活动上下文约束,GetFirstArchitectureContext() 改为显式返回当前活动上下文,不再依赖并发字典枚举顺序
    • GameContext.GetByType(Type)Get<T>()TryGet<T>() 增加对当前活动上下文的兼容匹配,保留按架构类型别名回查能力
    • MicrosoftDiContainer.Get<T>() / Get(Type) 的预冻结实例查询改为复用 CollectRegisteredImplementationInstances(...)
    • ResolveCqrsRegistrationService() 改为复用同一条注册阶段实例可见性路径,并把失败信息收敛为更明确的契约提示
    • IIocContainer XML 文档与 docs/zh-CN/core/context.mddocs/zh-CN/core/rule.mddocs/zh-CN/source-generators/context-aware-generator.md 已同步到“当前活动上下文 / 预冻结查询”语义
  • 测试与验证:
    • 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

阶段销毁闭环与文档收口完成SINGLE-CONTEXT-PRIORITY-RP-002

  • 实现摘要:
    • Architecture.DestroyAsync() 新增 finally 解绑,确保销毁完成后自动从 GameContext 移除当前架构类型绑定
    • ArchitectureLifecycleBehaviorTests 新增销毁解绑、失败初始化后解绑、以及销毁后新 ContextAwareBase 实例不再回退到过期上下文的回归测试
    • docs/zh-CN/source-generators/context-get-generator.md 已把“多架构场景”改写为“自定义上下文来源”,收口对全局多架构并存的暗示
  • 测试与验证:
    • python3 scripts/license-header.py --check 通过
    • 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 testdotnet build 时出现 bin/Release 文件占用导致的 MSBuild copy 冲突;按仓库规则改为单独重跑直接命令后结果通过
    • dotnet build GFramework.Core/GFramework.Core.csproj -c Release 单独重跑通过,0 warning / 0 error

当前下一步

  1. 若后续要进一步彻底移除全局回退,可单独评估 GameContext 公开别名字典的收口策略与生成器默认 provider 的进一步简化空间