using Yi.Framework.Core.Utils;
namespace Yi.Framework.MultiTenancy;
///
/// 当前租户实现
///
public class CurrentTenant : ICurrentTenant
{
private readonly ICurrentTenantAccessor _currentTenantAccessor;
///
public CurrentTenant(ICurrentTenantAccessor currentTenantAccessor)
{
_currentTenantAccessor = currentTenantAccessor;
}
///
/// 是否有效
///
public virtual bool IsAvailable => Id != Guid.Empty;
///
/// 租户ID
///
public virtual Guid Id => _currentTenantAccessor.Current?.TenantId ?? Guid.Empty;
///
/// 租户名称
///
public string? Name => _currentTenantAccessor.Current?.Name;
///
/// 替换租户
///
///
///
///
public IDisposable Change(Guid? id, string? name = null)
{
return SetCurrent(id, name);
}
///
/// 设置当前租户
///
///
private IDisposable SetCurrent(Guid? tenantId, string? name = null)
{
BasicTenantInfo? parentScope = _currentTenantAccessor.Current;
_currentTenantAccessor.Current = new BasicTenantInfo(tenantId, name);
return new DisposeAction>(static ((ICurrentTenantAccessor, BasicTenantInfo) state) =>
{
(ICurrentTenantAccessor currentTenantAccessor, BasicTenantInfo parentScope) = state;
currentTenantAccessor.Current = parentScope;
},
(_currentTenantAccessor, parentScope));
}
}