使用 WorkContext
本页面向需要在 Web、Job、后台任务、并发任务里统一上下文行为的人。它帮助你快速判断“这个场景该不该创建 Scope、该继承什么、该从哪里取身份和时区”。
我现在要解决什么
- HTTP 请求里怎么用 WorkContext。
- 后台线程和
Task.Run里怎么创建新作用域。 - 什么时候用
CreateScopeWithWorkContext(),什么时候用CreateScopeWithWorkContextForNewTask()。 - 多租户和系统身份切换如何做。
先看哪几页
最短落地路径
- 请求内:依赖框架自动初始化。
- 新线程/新任务:显式创建新 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。
排障入口
- 先对照 WorkContext 里的生命周期图和父子 Scope 图。
- 如果问题发生在后台线程,再回 运行 Job 与后台任务 看宿主边界。
- 如果保存数据库时报上下文错误,再联动看 做数据访问 和 数据访问。
真实项目怎么做
- niusys-webapi:后台逻辑显式创建 WorkContext。
- gmandarin-backend:JobActivator 内附着和释放 WorkContext。
- woscm:多租户后台服务中的嵌套 Scope 与租户身份切换。