agilelabs-fx-docs main workcontexts/overview.md

WorkContext 概览

WorkContext(工作上下文)是 AgileLabs Framework 中承载业务状态的核心抽象。它在不同执行场景(HTTP 请求、后台任务、Hangfire Job、并行 Task)中提供一致的上下文信息,如身份、语言、活动链路等。

场景定义:

  • Http请求场景(HttpRequest)
  • Job场景(Hangifre Job, Quartz Job)
  • 异步任务场景(Task.Factory.Run)
  • 后台任务(BackgroundService, IhostedService)

WorkContext 的“Work”指为完成某个功能而存在的独立运行单元,可嵌套。

行为说明

基于 HTTP 请求

WebWorkContextInitMiddleware 会在每个请求开始时创建 IServiceScopeIWorkContext,请求结束时统一释放。日志 TraceId/SpanId 会写入 WorkContext.TraceId,便于跨组件追踪。

非 HTTP 场景

在后台任务、Hangfire Job、Task.Run 等场景,可手动创建 WorkContext:

using var scope = AgileLabContexts.Context.CreateScopeWithWorkContext();

如需在新线程中使用,应调用 CreateScopeWithWorkContextForNewTask() 确保 AsyncLocal 隔离。

创建时需要区分是否在子线程

没有开启子线程: CreateScopeWithWorkContext();

开启了子线程: CreateScopeWithWorkContextForNewTask();

创建方式

通过全局静态上下文创建

// 为新的子线程创建独立的上下文
AgileLabContexts.Context.CreateScopeWithWorkContextForNewTask();

// 在当前线程创建一个子上下文
AgileLabContexts.Context.CreateScopeWithWorkContext();

通过当前上下文创建子上下文

// 为新的子线程创建独立的上下文
CurrentWorkContext.CreateScopeWithWorkContextForNewTask();

// 在当前线程创建一个子上下文
CurrentWorkContext.CreateScopeWithWorkContextFor();

子上下文创建时的数据继承

PropertiesInheritFlag/PropertiesInheritMode 控制继承策略:

  • 标准属性(Identity、Culture、TimeZone 等)默认深拷贝,确保线程安全。
  • Items 字典会复制引用,需要留意线程安全,可通过自定义 Feature/缓存隔离。

创建与销毁时机

WorkContext 与 IServiceScope 同生命周期:Scope 创建后初始化,Scope Dispose 前触发 WorkContext 销毁事件。可通过 WorkContextTraceTable 订阅 WorkContextCreatedEventWorkContextDisposingEvent,用于监控上下文数量与 QPS。