agilelabs-fx-docs main tasks/use-workcontext.md

使用 WorkContext

本页面向需要在 Web、Job、后台任务、并发任务里统一上下文行为的人。它帮助你快速判断“这个场景该不该创建 Scope、该继承什么、该从哪里取身份和时区”。

我现在要解决什么

  • HTTP 请求里怎么用 WorkContext。
  • 后台线程和 Task.Run 里怎么创建新作用域。
  • 什么时候用 CreateScopeWithWorkContext(),什么时候用 CreateScopeWithWorkContextForNewTask()
  • 多租户和系统身份切换如何做。

先看哪几页

  1. WorkContext
  2. 宿主与启动
  3. 时间与多时区

最短落地路径

  • 请求内:依赖框架自动初始化。
  • 新线程/新任务:显式创建新 Scope。
  • 多租户切换:在子 Scope 内切身份,不复用父作用域服务。

场景与 API 对照

你现在在哪个场景 应该用什么 备注
MVC / WebAPI 请求内 直接用当前 IWorkContextCore 请求开始时已自动附着
当前线程开子 Scope CreateScopeWithWorkContext() 结束后会恢复父上下文
Task.Run / 新线程 CreateScopeWithWorkContextForNewTask() 强制新的 Holder,避免串线
当前没有 WorkContext AgileLabContexts.Context.CreateScopeWithWorkContext() 从 Root 容器起新上下文

错误用法对照

  • Task.Run 里继续用父请求注入出来的 Repository。
  • scope.WorkContext.ServiceProvider 缓存成字段,Scope 结束后继续复用。
  • 多租户切换直接修改父上下文身份,不开子 Scope。

排障入口

真实项目怎么做

  • niusys-webapi:后台逻辑显式创建 WorkContext。
  • gmandarin-backend:JobActivator 内附着和释放 WorkContext。
  • woscm:多租户后台服务中的嵌套 Scope 与租户身份切换。

相关主题