agilelabs-fx-docs main fundamentals/agilelabs-contexts/overview.md

AgileLabsContexts 与 AgileLabContext

AgileLabsContexts 提供全局上下文访问,AgileLabContext 则是具体实现,负责管理 ServiceProvider、WorkContext、Scope 等资源。

设计目标

  • 全局可访问:通过 AgileLabContexts.Context 获取当前 IAgileLabContext
  • 线程安全:每个 CreateScopeWithWorkContext() 调用都会创建独立 IServiceScopeIWorkContext
  • 服务定位器兼容:保留 RootServiceProvider 访问能力,方便处理遗留代码。

核心 API

方法 说明
CreateScopeWithWorkContext() 在当前线程创建子 Scope/WorkContext,继承上层部分属性。
CreateScopeWithWorkContextForNewTask() 在新线程/Task 中使用,确保 AsyncLocal 正确隔离。
Context.RootServiceProvider 仅在特殊场景下访问根容器,优先使用 DI。
Context.BootstrapLogger 获取启动阶段 Logger,用于框架内部日志。

WorkContext 生命周期

  • 每个 HTTP 请求创建一个 IWorkContextScope(参见 WebWorkContextInitMiddleware)。
  • 通过 WorkContextTraceTable 可以观察当前 WorkContext 数量、创建/销毁事件。
  • 子上下文会根据 PropertiesInheritFlag 决定哪些属性深拷贝、哪些保持引用。

与 Activity 集成

AgileLabContexts.Context.CreateScopeWithWorkContext() 会:

  1. 创建 Activity 并写入 WorkContext.TraceId/SpanId
  2. IServiceProviderIWorkContextCore 注入到新 Scope。
  3. 当 Scope Dispose 时,自动结束 Activity。

RootServiceProvider 访问

AgileLabContexts.Context.RootServiceProvider.GetRequiredService<T>();

仅推荐用于:

  • 框架级别的后门能力(例如 WorkContextTraceTable 诊断)。
  • 迁移遗留代码时的过渡阶段。

与 AppBuildContext 的关系

  • AgileLabApplication.InitAppBuildContexts() 会实例化 AgileLabContext 并赋值给 AgileLabContexts.Context
  • AppBuildContext.AppContext 保存该实例,供启动阶段调用 CallStartupInitServiceAsync 等方法。

相关章节