diff --git a/src/Volo.Abp.MultiTenancy/Volo/Abp/MultiTenancy/CurrentTenantResolveContext.cs b/src/Volo.Abp.MultiTenancy/Volo/Abp/MultiTenancy/CurrentTenantResolveContext.cs new file mode 100644 index 0000000000..e68450fdee --- /dev/null +++ b/src/Volo.Abp.MultiTenancy/Volo/Abp/MultiTenancy/CurrentTenantResolveContext.cs @@ -0,0 +1,9 @@ +namespace Volo.Abp.MultiTenancy +{ + public class CurrentTenantResolveContext : ICurrentTenantResolveContext + { + public ITenantInfo Tenant { get; set; } + + public bool Handled { get; set; } + } +} \ No newline at end of file diff --git a/src/Volo.Abp.MultiTenancy/Volo/Abp/MultiTenancy/ICurrentTenantResolveContext.cs b/src/Volo.Abp.MultiTenancy/Volo/Abp/MultiTenancy/ICurrentTenantResolveContext.cs new file mode 100644 index 0000000000..61aa9273ec --- /dev/null +++ b/src/Volo.Abp.MultiTenancy/Volo/Abp/MultiTenancy/ICurrentTenantResolveContext.cs @@ -0,0 +1,9 @@ +namespace Volo.Abp.MultiTenancy +{ + public interface ICurrentTenantResolveContext + { + ITenantInfo Tenant { get; set; } + + bool Handled { get; set; } + } +} \ No newline at end of file diff --git a/src/Volo.Abp.MultiTenancy/Volo/Abp/MultiTenancy/IMultiTenancyManager.cs b/src/Volo.Abp.MultiTenancy/Volo/Abp/MultiTenancy/IMultiTenancyManager.cs new file mode 100644 index 0000000000..43aa6db2e0 --- /dev/null +++ b/src/Volo.Abp.MultiTenancy/Volo/Abp/MultiTenancy/IMultiTenancyManager.cs @@ -0,0 +1,7 @@ +namespace Volo.Abp.MultiTenancy +{ + public interface IMultiTenancyManager + { + ITenantInfo CurrentTenant { get; } + } +} \ No newline at end of file diff --git a/src/Volo.Abp.MultiTenancy/Volo/Abp/MultiTenancy/ITenantInfo.cs b/src/Volo.Abp.MultiTenancy/Volo/Abp/MultiTenancy/ITenantInfo.cs new file mode 100644 index 0000000000..eb72ef6e8f --- /dev/null +++ b/src/Volo.Abp.MultiTenancy/Volo/Abp/MultiTenancy/ITenantInfo.cs @@ -0,0 +1,9 @@ +namespace Volo.Abp.MultiTenancy +{ + public interface ITenantInfo + { + string Id { get; } + + string Name { get; } + } +} \ No newline at end of file diff --git a/src/Volo.Abp.MultiTenancy/Volo/Abp/MultiTenancy/ITenantResolver.cs b/src/Volo.Abp.MultiTenancy/Volo/Abp/MultiTenancy/ITenantResolver.cs new file mode 100644 index 0000000000..5c3904bebf --- /dev/null +++ b/src/Volo.Abp.MultiTenancy/Volo/Abp/MultiTenancy/ITenantResolver.cs @@ -0,0 +1,7 @@ +namespace Volo.Abp.MultiTenancy +{ + public interface ITenantResolver + { + void Resolve(ICurrentTenantResolveContext context); + } +} \ 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 94c90d06bc..e2b5665985 100644 --- a/src/Volo.Abp.MultiTenancy/Volo/Abp/MultiTenancy/MultiTenancyManager.cs +++ b/src/Volo.Abp.MultiTenancy/Volo/Abp/MultiTenancy/MultiTenancyManager.cs @@ -3,42 +3,31 @@ using System.Collections.Generic; namespace Volo.Abp.MultiTenancy { - public interface ITenantInfo - { - Guid Id { get; } - - string Name { get; } - } - - public interface IMultiTenancyManager - { - ITenantInfo CurrentTenant { get; } - } - public class MultiTenancyManager : IMultiTenancyManager { public ITenantInfo CurrentTenant => GetCurrentTenant(); - private readonly IEnumerable _currentTenantResolvers; + private readonly IEnumerable _currentTenantResolvers; - public MultiTenancyManager(IEnumerable currentTenantResolvers) + public MultiTenancyManager(IEnumerable currentTenantResolvers) { _currentTenantResolvers = currentTenantResolvers; } - public virtual ITenantInfo GetCurrentTenant() + protected virtual ITenantInfo GetCurrentTenant() { - throw new NotImplementedException(); + var context = new CurrentTenantResolveContext(); + + foreach (var currentTenantResolver in _currentTenantResolvers) + { + currentTenantResolver.Resolve(context); + if (context.Handled) + { + break; + } + } + + return context.Tenant; } } - - public interface ICurrentTenantResolver - { - void Resolve(ICurrentTenantResolveContext context); - } - - public interface ICurrentTenantResolveContext - { - - } } diff --git a/src/Volo.Abp.MultiTenancy/Volo/Abp/MultiTenancy/TenantInfo.cs b/src/Volo.Abp.MultiTenancy/Volo/Abp/MultiTenancy/TenantInfo.cs new file mode 100644 index 0000000000..83a6f6c3fd --- /dev/null +++ b/src/Volo.Abp.MultiTenancy/Volo/Abp/MultiTenancy/TenantInfo.cs @@ -0,0 +1,25 @@ +using JetBrains.Annotations; + +namespace Volo.Abp.MultiTenancy +{ + public class TenantInfo : ITenantInfo + { + public string Id { get; } + + public string Name { get; } + + private TenantInfo() + { + + } + + public TenantInfo([NotNull] string id, [NotNull] string name) + { + Check.NotNull(id, nameof(id)); + Check.NotNull(name, nameof(name)); + + Id = id; + Name = name; + } + } +} \ No newline at end of file diff --git a/src/Volo.Abp.MultiTenancy/Volo/Abp/MultiTenancy/TenantResolverAction.cs b/src/Volo.Abp.MultiTenancy/Volo/Abp/MultiTenancy/TenantResolverAction.cs new file mode 100644 index 0000000000..7652c1352c --- /dev/null +++ b/src/Volo.Abp.MultiTenancy/Volo/Abp/MultiTenancy/TenantResolverAction.cs @@ -0,0 +1,22 @@ +using System; +using JetBrains.Annotations; + +namespace Volo.Abp.MultiTenancy +{ + public class TenantResolverAction : ITenantResolver + { + private readonly Action _resolveAction; + + public TenantResolverAction([NotNull] Action resolveAction) + { + Check.NotNull(resolveAction, nameof(resolveAction)); + + _resolveAction = resolveAction; + } + + public void Resolve(ICurrentTenantResolveContext context) + { + _resolveAction(context); + } + } +} \ No newline at end of file diff --git a/test/Volo.Abp.MultiTenancy.Tests/Volo.Abp.MultiTenancy.Tests.xproj b/test/Volo.Abp.MultiTenancy.Tests/Volo.Abp.MultiTenancy.Tests.xproj index a26006a441..a07ca9c705 100644 --- a/test/Volo.Abp.MultiTenancy.Tests/Volo.Abp.MultiTenancy.Tests.xproj +++ b/test/Volo.Abp.MultiTenancy.Tests/Volo.Abp.MultiTenancy.Tests.xproj @@ -16,5 +16,8 @@ 2.0 + + + \ No newline at end of file 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 new file mode 100644 index 0000000000..2d12040219 --- /dev/null +++ b/test/Volo.Abp.MultiTenancy.Tests/Volo/Abp/MultiTenancy/MultiTenantManager_TenantResolver_Tests.cs @@ -0,0 +1,77 @@ +using System; +using Shouldly; +using Xunit; + +namespace Volo.Abp.MultiTenancy +{ + public class MultiTenantManager_TenantResolver_Tests + { + [Fact] + public void Should_Get_Current_Tenant_As_Null_If_No_Resolver() + { + //Arrange + + var manager = new MultiTenancyManager(new ITenantResolver[0]); + + //Act + + manager.CurrentTenant.ShouldBeNull(); + } + + [Fact] + public void Should_Get_Current_Tenant_From_Single_Resolver() + { + //Arrange + + var fakeTenant = new TenantInfo(Guid.NewGuid().ToString(), "acme"); + + //Act + + var manager = new MultiTenancyManager(new[] + { + new TenantResolverAction(context => + { + context.Tenant = fakeTenant; + context.Handled = true; + }) + }); + + //Assert + + manager.CurrentTenant.ShouldBe(fakeTenant); + } + + + [Fact] + public void Should_Get_Current_Tenant_From_Two_Resolvers() + { + //Arrange + + var fakeTenant = new TenantInfo(Guid.NewGuid().ToString(), "acme"); + + //Act + + var manager = new MultiTenancyManager(new[] + { + new TenantResolverAction(context => + { + context.Tenant = new TenantInfo(Guid.NewGuid().ToString(), "skipped-tenant"); + }), + new TenantResolverAction(context => + { + context.Tenant = fakeTenant; + context.Handled = true; + }), + new TenantResolverAction(context => + { + context.Tenant = new TenantInfo(Guid.NewGuid().ToString(), "skipped-tenant"); + context.Handled = true; + }) + }); + + //Assert + + manager.CurrentTenant.ShouldBe(fakeTenant); + } + } +}