AgileLabsContexts 与 AgileLabContext
AgileLabsContexts 提供全局上下文访问,AgileLabContext 则是具体实现,负责管理 ServiceProvider、WorkContext、Scope 等资源。
设计目标
- 全局可访问:通过
AgileLabContexts.Context获取当前IAgileLabContext。 - 线程安全:每个
CreateScopeWithWorkContext()调用都会创建独立IServiceScope与IWorkContext。 - 服务定位器兼容:保留
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() 会:
- 创建
Activity并写入WorkContext.TraceId/SpanId。 - 将
IServiceProvider、IWorkContextCore注入到新 Scope。 - 当 Scope Dispose 时,自动结束 Activity。
RootServiceProvider 访问
AgileLabContexts.Context.RootServiceProvider.GetRequiredService<T>();
仅推荐用于:
- 框架级别的后门能力(例如
WorkContextTraceTable诊断)。 - 迁移遗留代码时的过渡阶段。
与 AppBuildContext 的关系
AgileLabApplication.InitAppBuildContexts()会实例化AgileLabContext并赋值给AgileLabContexts.Context。AppBuildContext.AppContext保存该实例,供启动阶段调用CallStartupInitServiceAsync等方法。
相关章节: