diff --git a/src/Volo.Abp.MultiTenancy/Volo/Abp/MultiTenancy/AmbientTenantAccessor.cs b/src/Volo.Abp.MultiTenancy/Volo/Abp/MultiTenancy/AmbientTenantAccessor.cs deleted file mode 100644 index d7b70e1ad9..0000000000 --- a/src/Volo.Abp.MultiTenancy/Volo/Abp/MultiTenancy/AmbientTenantAccessor.cs +++ /dev/null @@ -1,21 +0,0 @@ -using System.Threading; -using Volo.DependencyInjection; - -namespace Volo.Abp.MultiTenancy -{ - public class AmbientTenantAccessor : IAmbientTenantAccessor, ISingletonDependency //TODO: Should be IScopedDependency? - { - public AmbientTenantInfo AmbientTenant - { - get { return _tenant.Value; } - set { _tenant.Value = value; } - } - - private readonly AsyncLocal _tenant; - - public AmbientTenantAccessor() - { - _tenant = new AsyncLocal(); - } - } -} \ No newline at end of file diff --git a/src/Volo.Abp.MultiTenancy/Volo/Abp/MultiTenancy/AmbientTenantScope.cs b/src/Volo.Abp.MultiTenancy/Volo/Abp/MultiTenancy/AmbientTenantScope.cs new file mode 100644 index 0000000000..f3cc1b8ed0 --- /dev/null +++ b/src/Volo.Abp.MultiTenancy/Volo/Abp/MultiTenancy/AmbientTenantScope.cs @@ -0,0 +1,18 @@ +using JetBrains.Annotations; + +namespace Volo.Abp.MultiTenancy +{ + public class AmbientTenantScope + { + /// + /// Null indicates the host. + /// Not null value for a tenant. + /// + public TenantInfo Tenant { get; set; } + + public AmbientTenantScope([CanBeNull] TenantInfo tenant) + { + Tenant = tenant; + } + } +} \ No newline at end of file diff --git a/src/Volo.Abp.MultiTenancy/Volo/Abp/MultiTenancy/AsyncLocalAmbientTenantScopeProvider.cs b/src/Volo.Abp.MultiTenancy/Volo/Abp/MultiTenancy/AsyncLocalAmbientTenantScopeProvider.cs new file mode 100644 index 0000000000..e609900bd3 --- /dev/null +++ b/src/Volo.Abp.MultiTenancy/Volo/Abp/MultiTenancy/AsyncLocalAmbientTenantScopeProvider.cs @@ -0,0 +1,32 @@ +using System; +using System.Threading; +using Volo.DependencyInjection; + +namespace Volo.Abp.MultiTenancy +{ + public class AsyncLocalAmbientTenantScopeProvider : IAmbientTenantScopeProvider, IScopedDependency + { + public AmbientTenantScope CurrentScope + { + get { return _tenant.Value; } + set { _tenant.Value = value; } + } + + private readonly AsyncLocal _tenant; + + public AsyncLocalAmbientTenantScopeProvider() + { + _tenant = new AsyncLocal(); + } + + public IDisposable CreateScope(TenantInfo tenantInfo) + { + var parentScope = CurrentScope; + CurrentScope = new AmbientTenantScope(tenantInfo); + return new DisposeAction(() => + { + CurrentScope = parentScope; + }); + } + } +} \ No newline at end of file diff --git a/src/Volo.Abp.MultiTenancy/Volo/Abp/MultiTenancy/IAmbientTenantAccessor.cs b/src/Volo.Abp.MultiTenancy/Volo/Abp/MultiTenancy/IAmbientTenantAccessor.cs deleted file mode 100644 index 146ad48c5c..0000000000 --- a/src/Volo.Abp.MultiTenancy/Volo/Abp/MultiTenancy/IAmbientTenantAccessor.cs +++ /dev/null @@ -1,22 +0,0 @@ -using JetBrains.Annotations; - -namespace Volo.Abp.MultiTenancy -{ - public interface IAmbientTenantAccessor - { - AmbientTenantInfo AmbientTenant { get; set; } - } - - public class AmbientTenantInfo - { - /// - /// Null for host. - /// - public TenantInfo Tenant { get; set; } - - public AmbientTenantInfo([CanBeNull] TenantInfo tenant) - { - Tenant = tenant; - } - } -} \ No newline at end of file diff --git a/src/Volo.Abp.MultiTenancy/Volo/Abp/MultiTenancy/IAmbientTenantScopeProvider.cs b/src/Volo.Abp.MultiTenancy/Volo/Abp/MultiTenancy/IAmbientTenantScopeProvider.cs new file mode 100644 index 0000000000..2876eab71a --- /dev/null +++ b/src/Volo.Abp.MultiTenancy/Volo/Abp/MultiTenancy/IAmbientTenantScopeProvider.cs @@ -0,0 +1,11 @@ +using System; + +namespace Volo.Abp.MultiTenancy +{ + public interface IAmbientTenantScopeProvider + { + AmbientTenantScope CurrentScope { get; set; } + + IDisposable CreateScope(TenantInfo tenantInfo); + } +} \ No newline at end of file diff --git a/src/Volo.Abp.MultiTenancy/Volo/Abp/MultiTenancy/MultiTenancyManager.cs b/src/Volo.Abp.MultiTenancy/Volo/Abp/MultiTenancy/MultiTenancyManager.cs index 7e793e1718..c054fd14a7 100644 --- a/src/Volo.Abp.MultiTenancy/Volo/Abp/MultiTenancy/MultiTenancyManager.cs +++ b/src/Volo.Abp.MultiTenancy/Volo/Abp/MultiTenancy/MultiTenancyManager.cs @@ -8,20 +8,22 @@ namespace Volo.Abp.MultiTenancy { public TenantInfo CurrentTenant => GetCurrentTenant(); - private readonly IAmbientTenantAccessor _ambientTenantAccessor; + private readonly IAmbientTenantScopeProvider _ambientTenantScopeProvider; private readonly IEnumerable _currentTenantResolvers; - public MultiTenancyManager(IAmbientTenantAccessor ambientTenantAccessor, IEnumerable currentTenantResolvers) + public MultiTenancyManager( + IAmbientTenantScopeProvider ambientTenantScopeProvider, + IEnumerable currentTenantResolvers) { - _ambientTenantAccessor = ambientTenantAccessor; + _ambientTenantScopeProvider = ambientTenantScopeProvider; _currentTenantResolvers = currentTenantResolvers; } protected virtual TenantInfo GetCurrentTenant() { - if (_ambientTenantAccessor.AmbientTenant != null) + if (_ambientTenantScopeProvider.CurrentScope != null) { - return _ambientTenantAccessor.AmbientTenant.Tenant; + return _ambientTenantScopeProvider.CurrentScope.Tenant; } var context = new CurrentTenantResolveContext(); @@ -40,14 +42,7 @@ namespace Volo.Abp.MultiTenancy public IDisposable ChangeTenant(TenantInfo tenantInfo) { - var oldValue = _ambientTenantAccessor.AmbientTenant; - - _ambientTenantAccessor.AmbientTenant = new AmbientTenantInfo(tenantInfo); - - return new DisposeAction(() => - { - _ambientTenantAccessor.AmbientTenant = oldValue; - }); + return _ambientTenantScopeProvider.CreateScope(tenantInfo); } } } diff --git a/src/Volo.Abp.MultiTenancy/Volo/Abp/MultiTenancy/TenantInfo.cs b/src/Volo.Abp.MultiTenancy/Volo/Abp/MultiTenancy/TenantInfo.cs index 00b27bb348..e55d2f72f8 100644 --- a/src/Volo.Abp.MultiTenancy/Volo/Abp/MultiTenancy/TenantInfo.cs +++ b/src/Volo.Abp.MultiTenancy/Volo/Abp/MultiTenancy/TenantInfo.cs @@ -8,6 +8,8 @@ namespace Volo.Abp.MultiTenancy public string Name { get; } + //TODO: Needed for serialization + [UsedImplicitly] private TenantInfo() { diff --git a/test/Volo.Abp.MultiTenancy.Tests/Volo/Abp/MultiTenancy/MultiTenantManager_TenantResolver_Tests.cs b/test/Volo.Abp.MultiTenancy.Tests/Volo/Abp/MultiTenancy/MultiTenantManager_TenantResolver_Tests.cs index b8027f0e12..33bebe6088 100644 --- a/test/Volo.Abp.MultiTenancy.Tests/Volo/Abp/MultiTenancy/MultiTenantManager_TenantResolver_Tests.cs +++ b/test/Volo.Abp.MultiTenancy.Tests/Volo/Abp/MultiTenancy/MultiTenantManager_TenantResolver_Tests.cs @@ -12,7 +12,7 @@ namespace Volo.Abp.MultiTenancy { //Arrange - var manager = new MultiTenancyManager(Substitute.For(), new ITenantResolver[0]); + var manager = new MultiTenancyManager(Substitute.For(), new ITenantResolver[0]); //Assert @@ -26,7 +26,7 @@ namespace Volo.Abp.MultiTenancy var fakeTenant = new TenantInfo(Guid.NewGuid().ToString(), "acme"); - var manager = new MultiTenancyManager(Substitute.For(), new[] + var manager = new MultiTenancyManager(Substitute.For(), new[] { new TenantResolverAction(context => { @@ -48,7 +48,7 @@ namespace Volo.Abp.MultiTenancy var fakeTenant = new TenantInfo(Guid.NewGuid().ToString(), "acme"); - var manager = new MultiTenancyManager(Substitute.For(), new[] + var manager = new MultiTenancyManager(Substitute.For(), new[] { new TenantResolverAction(context => { @@ -78,7 +78,7 @@ namespace Volo.Abp.MultiTenancy var oldTenant = new TenantInfo(Guid.NewGuid().ToString(), "old-tenant"); - var manager = new MultiTenancyManager(Substitute.For(), new[] + var manager = new MultiTenancyManager(new AsyncLocalAmbientTenantScopeProvider(), new[] { new TenantResolverAction(context => {