WorkContext 概览
WorkContext(工作上下文)是 AgileLabs Framework 中承载业务状态的核心抽象。它在不同执行场景(HTTP 请求、后台任务、Hangfire Job、并行 Task)中提供一致的上下文信息,如身份、语言、活动链路等。
场景定义:
- Http请求场景(HttpRequest)
- Job场景(Hangifre Job, Quartz Job)
- 异步任务场景(Task.Factory.Run)
- 后台任务(BackgroundService, IhostedService)
WorkContext 的“Work”指为完成某个功能而存在的独立运行单元,可嵌套。
行为说明
基于 HTTP 请求
WebWorkContextInitMiddleware 会在每个请求开始时创建 IServiceScope 与 IWorkContext,请求结束时统一释放。日志 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 订阅 WorkContextCreatedEvent、WorkContextDisposingEvent,用于监控上下文数量与 QPS。