diff --git a/src/Core/TakeoutSaaS.Shared.Abstractions/Tenancy/TenantContextAccessorExtensions.cs b/src/Core/TakeoutSaaS.Shared.Abstractions/Tenancy/TenantContextAccessorExtensions.cs new file mode 100644 index 0000000..074abab --- /dev/null +++ b/src/Core/TakeoutSaaS.Shared.Abstractions/Tenancy/TenantContextAccessorExtensions.cs @@ -0,0 +1,34 @@ +namespace TakeoutSaaS.Shared.Abstractions.Tenancy; + +/// +/// 扩展方法。 +/// +public static class TenantContextAccessorExtensions +{ + /// + /// 进入指定租户上下文作用域,释放后自动恢复之前的上下文。 + /// + /// 租户上下文访问器。 + /// 租户 ID。 + /// 上下文来源标识(例如 scheduler、seed、admin)。 + /// 租户编码(可选)。 + /// 作用域对象。 + public static IDisposable EnterTenantScope( + this ITenantContextAccessor accessor, + long tenantId, + string source, + string? tenantCode = null) + { + var previous = accessor.Current; + accessor.Current = new TenantContext(tenantId, tenantCode, source); + return new TenantContextScope(accessor, previous); + } + + private sealed class TenantContextScope(ITenantContextAccessor accessor, TenantContext? previous) : IDisposable + { + public void Dispose() + { + accessor.Current = previous; + } + } +}