From 7259155a986de3f02810ce552f679097fbc99013 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Halil=20=C4=B0brahim=20Kalkan?= Date: Fri, 5 Jan 2018 17:15:27 +0300 Subject: [PATCH] Refactoring multitenancy module. --- Volo.Abp.sln | 7 +++- docs/Multi-Tenancy.md | 8 ++-- .../AbpDesk.ConsoleDemo/appsettings.json | 28 +++++++++---- .../AbpDesk.Web.Mvc/AbpDeskWebMvcModule.cs | 4 +- .../AbpAspNetCoreMultiTenancyModule.cs | 2 +- .../MultiTenancyOptionsExtensions.cs | 2 +- .../Abp/MultiTenancy/ActionTenantResolver.cs | 0 .../Abp/MultiTenancy/ITenantResolveContext.cs | 0 .../Volo/Abp/MultiTenancy/ITenantResolver.cs | 0 .../Abp/MultiTenancy/TenantResolveContext.cs | 2 +- .../Abp/MultiTenancy/TenantResolveOptions.cs} | 4 +- .../Volo.Abp.MultiTenancy.csproj | 1 + .../MultiTenantConnectionStringResolver.cs | 6 +-- .../Abp/MultiTenancy/AbpMultiTenancyModule.cs | 3 +- .../AsyncLocalTenantScopeProvider.cs | 2 +- .../MultiTenancy/ConfigurationTenantStore.cs | 4 +- .../ConfigurationTenantStoreOptions.cs | 4 +- .../Abp/MultiTenancy/IMultiTenancyManager.cs | 4 +- .../Abp/MultiTenancy/ITenantScopeProvider.cs | 2 +- .../Volo/Abp/MultiTenancy/ITenantStore.cs | 4 +- .../Abp/MultiTenancy/MultiTenancyManager.cs | 14 ++++--- .../Volo/Abp/MultiTenancy/Tenant.cs | 40 +++++++++++++++++++ .../MultiTenancy/TenantConnectionString.cs | 30 ++++++++++++++ .../Abp/MultiTenancy/TenantInformation.cs | 28 ------------- .../Volo/Abp/MultiTenancy/TenantScope.cs | 4 +- .../Volo/Abp/AspNetCore/App/AppModule.cs | 4 +- .../AspNetCoreMultiTenancy_Tests.cs | 2 +- ...ltiTenantConnectionStringResolver_Tests.cs | 10 +++-- .../MultiTenancy/MultiTenantManager_Tests.cs | 6 +-- 29 files changed, 143 insertions(+), 82 deletions(-) rename src/{Volo.Abp.MultiTenancy => Volo.Abp.MultiTenancy.Abstractions}/Volo/Abp/MultiTenancy/ActionTenantResolver.cs (100%) rename src/{Volo.Abp.MultiTenancy => Volo.Abp.MultiTenancy.Abstractions}/Volo/Abp/MultiTenancy/ITenantResolveContext.cs (100%) rename src/{Volo.Abp.MultiTenancy => Volo.Abp.MultiTenancy.Abstractions}/Volo/Abp/MultiTenancy/ITenantResolver.cs (100%) rename src/{Volo.Abp.MultiTenancy => Volo.Abp.MultiTenancy.Abstractions}/Volo/Abp/MultiTenancy/TenantResolveContext.cs (90%) rename src/{Volo.Abp.MultiTenancy/Volo/Abp/MultiTenancy/MultiTenancyOptions.cs => Volo.Abp.MultiTenancy.Abstractions/Volo/Abp/MultiTenancy/TenantResolveOptions.cs} (78%) create mode 100644 src/Volo.Abp.MultiTenancy/Volo/Abp/MultiTenancy/Tenant.cs create mode 100644 src/Volo.Abp.MultiTenancy/Volo/Abp/MultiTenancy/TenantConnectionString.cs delete mode 100644 src/Volo.Abp.MultiTenancy/Volo/Abp/MultiTenancy/TenantInformation.cs diff --git a/Volo.Abp.sln b/Volo.Abp.sln index 7af2b1bd0a..0294f91101 100644 --- a/Volo.Abp.sln +++ b/Volo.Abp.sln @@ -228,6 +228,8 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Modules", "Modules", "{3B48 EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Samples", "Samples", "{282A5684-F573-47BB-B044-10F3F710E22A}" EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Abp.MultiTenancy", "Abp.MultiTenancy", "{CA154803-3589-47B3-B7CB-B18F94FE1EB6}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -611,7 +613,7 @@ Global {1020F5FD-6A97-40C2-AFCA-EBDF641DF111} = {447C8A77-E5F0-4538-8687-7383196D04EA} {02BE03BA-3411-448C-AB61-CB36407CC49A} = {C4C6961D-01CC-49A5-8B96-2A36E71CF01F} {B1D860BB-6EC6-4BAE-ADAA-C2AEC2FFB510} = {37087D1B-3693-4E96-983D-A69F210BDE53} - {58FA9F8F-216D-4C93-8929-D40D22B11CA7} = {4C753F64-0C93-4D65-96C2-A40893AFC1E8} + {58FA9F8F-216D-4C93-8929-D40D22B11CA7} = {CA154803-3589-47B3-B7CB-B18F94FE1EB6} {05271341-7A15-484C-9FD6-802A4193F4DE} = {37087D1B-3693-4E96-983D-A69F210BDE53} {7CC7946B-E026-4F66-8D4F-4F78F4801D43} = {C4C6961D-01CC-49A5-8B96-2A36E71CF01F} {2C282467-2CD5-4750-BE1F-CA8BD8ECC6EA} = {37087D1B-3693-4E96-983D-A69F210BDE53} @@ -674,7 +676,7 @@ Global {BC55B87F-D2BD-428D-8F78-A95EE7BDFDFA} = {4C753F64-0C93-4D65-96C2-A40893AFC1E8} {5E7381EE-54BC-4BFD-883A-8C6578C2CAD7} = {4C753F64-0C93-4D65-96C2-A40893AFC1E8} {5D2275B7-0745-420A-AF1C-32C563DAB5C8} = {37087D1B-3693-4E96-983D-A69F210BDE53} - {10EB789E-C993-4BE8-BA43-C419936C7233} = {4C753F64-0C93-4D65-96C2-A40893AFC1E8} + {10EB789E-C993-4BE8-BA43-C419936C7233} = {CA154803-3589-47B3-B7CB-B18F94FE1EB6} {8D22063D-88DE-4F7A-A917-C81AB4ACE601} = {4C753F64-0C93-4D65-96C2-A40893AFC1E8} {5BECBCEF-459F-424B-A15A-0558D291842A} = {4C753F64-0C93-4D65-96C2-A40893AFC1E8} {87117AFB-4C87-40CB-889E-F1D97C504906} = {37087D1B-3693-4E96-983D-A69F210BDE53} @@ -704,6 +706,7 @@ Global {4FE9C900-8207-46D1-98F6-4748C154C440} = {5DF0E140-0513-4D0D-BE2E-3D4D85CD70E6} {3B481ACC-5BB3-4189-880C-5F7A27EAEB70} = {5DF0E140-0513-4D0D-BE2E-3D4D85CD70E6} {282A5684-F573-47BB-B044-10F3F710E22A} = {5DF0E140-0513-4D0D-BE2E-3D4D85CD70E6} + {CA154803-3589-47B3-B7CB-B18F94FE1EB6} = {3B481ACC-5BB3-4189-880C-5F7A27EAEB70} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {BB97ECF4-9A84-433F-A80B-2A3285BDD1D5} diff --git a/docs/Multi-Tenancy.md b/docs/Multi-Tenancy.md index fd7c344092..6561b50bc3 100644 --- a/docs/Multi-Tenancy.md +++ b/docs/Multi-Tenancy.md @@ -120,7 +120,7 @@ The first thing for a multi-tenant application is to determine the current tenan ##### Custom Tenant Resolvers -You can add your custom tenant resolver to **MultiTenancyOptions** in your module's ConfigureServices method as like below: +You can add your custom tenant resolver to **TenantResolveOptions** in your module's ConfigureServices method as like below: ````C# using Microsoft.Extensions.DependencyInjection; @@ -134,7 +134,7 @@ namespace MyCompany.MyProject { public override void ConfigureServices(IServiceCollection services) { - services.Configure(options => + services.Configure(options => { options.TenantResolvers.Add(new MyCustomTenantResolver()); }); @@ -330,7 +330,7 @@ services.Configure(options => ##### Domain Tenant Resolver -In a real application, most of times you will want to determine current tenant either by subdomain (like mytenant1.mydomain.com) or by the whole domain (like mytenant.com). If so, you can configure MultiTenancyOptions to add a domain tenant resolver. +In a real application, most of times you will want to determine current tenant either by subdomain (like mytenant1.mydomain.com) or by the whole domain (like mytenant.com). If so, you can configure TenantResolveOptions to add a domain tenant resolver. ###### Example: Add a subdomain resolver @@ -347,7 +347,7 @@ namespace MyCompany.MyProject { public override void ConfigureServices(IServiceCollection services) { - services.Configure(options => + services.Configure(options => { //Subdomain format: {0}.mydomain.com (adding as the highest priority resolver) options.TenantResolvers.Insert(0, new DomainTenantResolver("{0}.mydomain.com")); diff --git a/src/AbpDesk/AbpDesk.ConsoleDemo/appsettings.json b/src/AbpDesk/AbpDesk.ConsoleDemo/appsettings.json index 606e269345..dad3aa4652 100644 --- a/src/AbpDesk/AbpDesk.ConsoleDemo/appsettings.json +++ b/src/AbpDesk/AbpDesk.ConsoleDemo/appsettings.json @@ -8,18 +8,30 @@ { "Id": "2D8BF07D-50F4-4A70-805E-C7618F008043", "Name": "Acme", - "ConnectionStrings": { - "Default": "", - "AbpDeskMongoBlog": "" - } + "ConnectionStrings": [ + { + "Name": "Default", + "Value": "..." + }, + { + "Name": "AbpDeskMongoBlog", + "Value": "..." + } + ] }, { "Id": "33A01BA1-4106-41DA-AF34-28028FB9BD1D", "Name": "Vlsft", - "ConnectionStrings": { - "Default": "", - "AbpDeskMongoBlog": "" - } + "ConnectionStrings": [ + { + "Name": "Default", + "Value": "..." + }, + { + "Name": "AbpDeskMongoBlog", + "Value": "..." + } + ] } ] } \ No newline at end of file diff --git a/src/AbpDesk/AbpDesk.Web.Mvc/AbpDeskWebMvcModule.cs b/src/AbpDesk/AbpDesk.Web.Mvc/AbpDeskWebMvcModule.cs index 97278ed865..bcf41ff344 100644 --- a/src/AbpDesk/AbpDesk.Web.Mvc/AbpDeskWebMvcModule.cs +++ b/src/AbpDesk/AbpDesk.Web.Mvc/AbpDeskWebMvcModule.cs @@ -72,11 +72,11 @@ namespace AbpDesk.Web.Mvc { options.Tenants = new[] { - new TenantInformation( + new Tenant( Guid.Parse("446a5211-3d72-4339-9adc-845151f8ada0"), "acme" ), - new TenantInformation( + new Tenant( Guid.Parse("25388015-ef1c-4355-9c18-f6b6ddbaf89d"), "volosoft" ) diff --git a/src/Volo.Abp.AspNetCore.MultiTenancy/Volo/Abp/AspNetCore/MultiTenancy/AbpAspNetCoreMultiTenancyModule.cs b/src/Volo.Abp.AspNetCore.MultiTenancy/Volo/Abp/AspNetCore/MultiTenancy/AbpAspNetCoreMultiTenancyModule.cs index 4b36924d13..c3e418ba5e 100644 --- a/src/Volo.Abp.AspNetCore.MultiTenancy/Volo/Abp/AspNetCore/MultiTenancy/AbpAspNetCoreMultiTenancyModule.cs +++ b/src/Volo.Abp.AspNetCore.MultiTenancy/Volo/Abp/AspNetCore/MultiTenancy/AbpAspNetCoreMultiTenancyModule.cs @@ -9,7 +9,7 @@ namespace Volo.Abp.AspNetCore.MultiTenancy { public override void ConfigureServices(IServiceCollection services) { - services.Configure(options => + services.Configure(options => { options.TenantResolvers.Insert(0, new QueryStringTenantResolver()); options.TenantResolvers.Insert(1, new RouteTenantResolver()); diff --git a/src/Volo.Abp.AspNetCore.MultiTenancy/Volo/Abp/MultiTenancy/MultiTenancyOptionsExtensions.cs b/src/Volo.Abp.AspNetCore.MultiTenancy/Volo/Abp/MultiTenancy/MultiTenancyOptionsExtensions.cs index 5ddb3a9399..0f939a31f3 100644 --- a/src/Volo.Abp.AspNetCore.MultiTenancy/Volo/Abp/MultiTenancy/MultiTenancyOptionsExtensions.cs +++ b/src/Volo.Abp.AspNetCore.MultiTenancy/Volo/Abp/MultiTenancy/MultiTenancyOptionsExtensions.cs @@ -4,7 +4,7 @@ namespace Volo.Abp.MultiTenancy { public static class MultiTenancyOptionsExtensions { - public static void AddDomainTenantResolver(this MultiTenancyOptions options, string domainFormat) + public static void AddDomainTenantResolver(this TenantResolveOptions options, string domainFormat) { options.TenantResolvers.Insert(0, new DomainTenantResolver(domainFormat)); } diff --git a/src/Volo.Abp.MultiTenancy/Volo/Abp/MultiTenancy/ActionTenantResolver.cs b/src/Volo.Abp.MultiTenancy.Abstractions/Volo/Abp/MultiTenancy/ActionTenantResolver.cs similarity index 100% rename from src/Volo.Abp.MultiTenancy/Volo/Abp/MultiTenancy/ActionTenantResolver.cs rename to src/Volo.Abp.MultiTenancy.Abstractions/Volo/Abp/MultiTenancy/ActionTenantResolver.cs diff --git a/src/Volo.Abp.MultiTenancy/Volo/Abp/MultiTenancy/ITenantResolveContext.cs b/src/Volo.Abp.MultiTenancy.Abstractions/Volo/Abp/MultiTenancy/ITenantResolveContext.cs similarity index 100% rename from src/Volo.Abp.MultiTenancy/Volo/Abp/MultiTenancy/ITenantResolveContext.cs rename to src/Volo.Abp.MultiTenancy.Abstractions/Volo/Abp/MultiTenancy/ITenantResolveContext.cs diff --git a/src/Volo.Abp.MultiTenancy/Volo/Abp/MultiTenancy/ITenantResolver.cs b/src/Volo.Abp.MultiTenancy.Abstractions/Volo/Abp/MultiTenancy/ITenantResolver.cs similarity index 100% rename from src/Volo.Abp.MultiTenancy/Volo/Abp/MultiTenancy/ITenantResolver.cs rename to src/Volo.Abp.MultiTenancy.Abstractions/Volo/Abp/MultiTenancy/ITenantResolver.cs diff --git a/src/Volo.Abp.MultiTenancy/Volo/Abp/MultiTenancy/TenantResolveContext.cs b/src/Volo.Abp.MultiTenancy.Abstractions/Volo/Abp/MultiTenancy/TenantResolveContext.cs similarity index 90% rename from src/Volo.Abp.MultiTenancy/Volo/Abp/MultiTenancy/TenantResolveContext.cs rename to src/Volo.Abp.MultiTenancy.Abstractions/Volo/Abp/MultiTenancy/TenantResolveContext.cs index 6f27d5be17..32baa69bc3 100644 --- a/src/Volo.Abp.MultiTenancy/Volo/Abp/MultiTenancy/TenantResolveContext.cs +++ b/src/Volo.Abp.MultiTenancy.Abstractions/Volo/Abp/MultiTenancy/TenantResolveContext.cs @@ -10,7 +10,7 @@ namespace Volo.Abp.MultiTenancy public bool Handled { get; set; } - internal bool HasResolvedTenantOrHost() + public bool HasResolvedTenantOrHost() { return Handled || TenantIdOrName != null; } diff --git a/src/Volo.Abp.MultiTenancy/Volo/Abp/MultiTenancy/MultiTenancyOptions.cs b/src/Volo.Abp.MultiTenancy.Abstractions/Volo/Abp/MultiTenancy/TenantResolveOptions.cs similarity index 78% rename from src/Volo.Abp.MultiTenancy/Volo/Abp/MultiTenancy/MultiTenancyOptions.cs rename to src/Volo.Abp.MultiTenancy.Abstractions/Volo/Abp/MultiTenancy/TenantResolveOptions.cs index e2730b4dab..ef23d7e1cf 100644 --- a/src/Volo.Abp.MultiTenancy/Volo/Abp/MultiTenancy/MultiTenancyOptions.cs +++ b/src/Volo.Abp.MultiTenancy.Abstractions/Volo/Abp/MultiTenancy/TenantResolveOptions.cs @@ -3,12 +3,12 @@ using JetBrains.Annotations; namespace Volo.Abp.MultiTenancy { - public class MultiTenancyOptions + public class TenantResolveOptions { [NotNull] public List TenantResolvers { get; } - public MultiTenancyOptions() + public TenantResolveOptions() { TenantResolvers = new List(); } diff --git a/src/Volo.Abp.MultiTenancy/Volo.Abp.MultiTenancy.csproj b/src/Volo.Abp.MultiTenancy/Volo.Abp.MultiTenancy.csproj index ae531a870f..44ce9b002e 100644 --- a/src/Volo.Abp.MultiTenancy/Volo.Abp.MultiTenancy.csproj +++ b/src/Volo.Abp.MultiTenancy/Volo.Abp.MultiTenancy.csproj @@ -15,6 +15,7 @@ + diff --git a/src/Volo.Abp.MultiTenancy/Volo/Abp/Data/MultiTenancy/MultiTenantConnectionStringResolver.cs b/src/Volo.Abp.MultiTenancy/Volo/Abp/Data/MultiTenancy/MultiTenantConnectionStringResolver.cs index 1b3bb99859..659f9cf9d1 100644 --- a/src/Volo.Abp.MultiTenancy/Volo/Abp/Data/MultiTenancy/MultiTenantConnectionStringResolver.cs +++ b/src/Volo.Abp.MultiTenancy/Volo/Abp/Data/MultiTenancy/MultiTenantConnectionStringResolver.cs @@ -31,12 +31,12 @@ namespace Volo.Abp.Data.MultiTenancy //Requesting default connection string if (connectionStringName == null) { - return tenant.ConnectionStrings.Default ?? + return tenant.FindDefaultConnectionString() ?? Options.ConnectionStrings.Default; } //Requesting specific connection string - var connString = tenant.ConnectionStrings.GetOrDefault(connectionStringName); + var connString = tenant.FindConnectionString(connectionStringName); if (connString != null) { return connString; @@ -53,7 +53,7 @@ namespace Volo.Abp.Data.MultiTenancy return connStringInOptions; } - return tenant.ConnectionStrings.Default ?? + return tenant.FindDefaultConnectionString() ?? Options.ConnectionStrings.Default; } } diff --git a/src/Volo.Abp.MultiTenancy/Volo/Abp/MultiTenancy/AbpMultiTenancyModule.cs b/src/Volo.Abp.MultiTenancy/Volo/Abp/MultiTenancy/AbpMultiTenancyModule.cs index e6d621c1be..dae8550524 100644 --- a/src/Volo.Abp.MultiTenancy/Volo/Abp/MultiTenancy/AbpMultiTenancyModule.cs +++ b/src/Volo.Abp.MultiTenancy/Volo/Abp/MultiTenancy/AbpMultiTenancyModule.cs @@ -6,7 +6,8 @@ namespace Volo.Abp.MultiTenancy { [DependsOn(typeof(AbpDataModule))] [DependsOn(typeof(AbpMultiTenancyAbstractionsModule))] - public class AbpMultiTenancyModule : AbpModule + [DependsOn(typeof(AbpDddModule))] + public class AbpMultiTenancyModule : AbpModule //TODO: This should be Volo.Abp.MultiTenancy.Domain! { public override void ConfigureServices(IServiceCollection services) { diff --git a/src/Volo.Abp.MultiTenancy/Volo/Abp/MultiTenancy/AsyncLocalTenantScopeProvider.cs b/src/Volo.Abp.MultiTenancy/Volo/Abp/MultiTenancy/AsyncLocalTenantScopeProvider.cs index ea01f9c0fa..2ac1adeccc 100644 --- a/src/Volo.Abp.MultiTenancy/Volo/Abp/MultiTenancy/AsyncLocalTenantScopeProvider.cs +++ b/src/Volo.Abp.MultiTenancy/Volo/Abp/MultiTenancy/AsyncLocalTenantScopeProvider.cs @@ -19,7 +19,7 @@ namespace Volo.Abp.MultiTenancy _currentScope = new AsyncLocal(); } - public IDisposable EnterScope(TenantInformation tenant) + public IDisposable EnterScope(Tenant tenant) { var parentScope = CurrentScope; CurrentScope = new TenantScope(tenant); diff --git a/src/Volo.Abp.MultiTenancy/Volo/Abp/MultiTenancy/ConfigurationTenantStore.cs b/src/Volo.Abp.MultiTenancy/Volo/Abp/MultiTenancy/ConfigurationTenantStore.cs index 968b71edf1..57c6ad9874 100644 --- a/src/Volo.Abp.MultiTenancy/Volo/Abp/MultiTenancy/ConfigurationTenantStore.cs +++ b/src/Volo.Abp.MultiTenancy/Volo/Abp/MultiTenancy/ConfigurationTenantStore.cs @@ -15,12 +15,12 @@ namespace Volo.Abp.MultiTenancy _options = options.Value; } - public TenantInformation Find(string name) + public Tenant Find(string name) { return _options.Tenants.FirstOrDefault(t => t.Name == name); } - public TenantInformation Find(Guid id) + public Tenant Find(Guid id) { return _options.Tenants.FirstOrDefault(t => t.Id == id); } diff --git a/src/Volo.Abp.MultiTenancy/Volo/Abp/MultiTenancy/ConfigurationTenantStoreOptions.cs b/src/Volo.Abp.MultiTenancy/Volo/Abp/MultiTenancy/ConfigurationTenantStoreOptions.cs index f4b38fcd95..b26900c968 100644 --- a/src/Volo.Abp.MultiTenancy/Volo/Abp/MultiTenancy/ConfigurationTenantStoreOptions.cs +++ b/src/Volo.Abp.MultiTenancy/Volo/Abp/MultiTenancy/ConfigurationTenantStoreOptions.cs @@ -2,11 +2,11 @@ { public class ConfigurationTenantStoreOptions { - public TenantInformation[] Tenants { get; set; } + public Tenant[] Tenants { get; set; } public ConfigurationTenantStoreOptions() { - Tenants = new TenantInformation[0]; + Tenants = new Tenant[0]; } } } \ 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 index bd389a8622..a7a9df91ed 100644 --- a/src/Volo.Abp.MultiTenancy/Volo/Abp/MultiTenancy/IMultiTenancyManager.cs +++ b/src/Volo.Abp.MultiTenancy/Volo/Abp/MultiTenancy/IMultiTenancyManager.cs @@ -3,12 +3,10 @@ using JetBrains.Annotations; namespace Volo.Abp.MultiTenancy { - //TODO: This is very similar to ITenantScopeProvider. Consider to unify them! - public interface IMultiTenancyManager { [CanBeNull] - TenantInformation CurrentTenant { get; } + Tenant CurrentTenant { get; } IDisposable ChangeTenant(Guid? tenantId); diff --git a/src/Volo.Abp.MultiTenancy/Volo/Abp/MultiTenancy/ITenantScopeProvider.cs b/src/Volo.Abp.MultiTenancy/Volo/Abp/MultiTenancy/ITenantScopeProvider.cs index e916f12b99..25396484aa 100644 --- a/src/Volo.Abp.MultiTenancy/Volo/Abp/MultiTenancy/ITenantScopeProvider.cs +++ b/src/Volo.Abp.MultiTenancy/Volo/Abp/MultiTenancy/ITenantScopeProvider.cs @@ -11,6 +11,6 @@ namespace Volo.Abp.MultiTenancy [CanBeNull] TenantScope CurrentScope { get; } - IDisposable EnterScope([CanBeNull] TenantInformation tenant); + IDisposable EnterScope([CanBeNull] Tenant tenant); } } \ No newline at end of file diff --git a/src/Volo.Abp.MultiTenancy/Volo/Abp/MultiTenancy/ITenantStore.cs b/src/Volo.Abp.MultiTenancy/Volo/Abp/MultiTenancy/ITenantStore.cs index 6bd2e363d1..32a46a3503 100644 --- a/src/Volo.Abp.MultiTenancy/Volo/Abp/MultiTenancy/ITenantStore.cs +++ b/src/Volo.Abp.MultiTenancy/Volo/Abp/MultiTenancy/ITenantStore.cs @@ -6,9 +6,9 @@ namespace Volo.Abp.MultiTenancy public interface ITenantStore { [CanBeNull] - TenantInformation Find(string name); + Tenant Find(string name); [CanBeNull] - TenantInformation Find(Guid id); + Tenant Find(Guid id); } } \ 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 f7cc16ee59..e6301a1d85 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 @@ using Volo.Abp.DependencyInjection; namespace Volo.Abp.MultiTenancy { + //TODO: This is very similar to ITenantScopeProvider. Consider to unify them! + public class MultiTenancyManager : IMultiTenancyManager, ITransientDependency { - public TenantInformation CurrentTenant => GetCurrentTenant(); + public Tenant CurrentTenant => GetCurrentTenant(); private readonly IServiceProvider _serviceProvider; private readonly ITenantScopeProvider _tenantScopeProvider; private readonly ITenantStore _tenantStore; - private readonly MultiTenancyOptions _options; + private readonly TenantResolveOptions _options; private readonly ILogger _logger; public MultiTenancyManager( IServiceProvider serviceProvider, ITenantScopeProvider tenantScopeProvider, - IOptions options, + IOptions options, ITenantStore tenantStore, ILogger logger) { @@ -64,7 +66,7 @@ namespace Volo.Abp.MultiTenancy return _tenantScopeProvider.EnterScope(tenant); } - protected virtual TenantInformation GetCurrentTenant() + protected virtual Tenant GetCurrentTenant() { if (_tenantScopeProvider.CurrentScope != null) { @@ -76,7 +78,7 @@ namespace Volo.Abp.MultiTenancy return GetCurrentTenantFromResolvers(); } - protected virtual TenantInformation GetCurrentTenantFromResolvers() + protected virtual Tenant GetCurrentTenantFromResolvers() //TODO: This should go to another class { if (!_options.TenantResolvers.Any()) { @@ -118,7 +120,7 @@ namespace Volo.Abp.MultiTenancy } [CanBeNull] - private TenantInformation GetValidatedTenantOrNull([NotNull] string tenantIdOrName) + private Tenant GetValidatedTenantOrNull([NotNull] string tenantIdOrName) { Guid tenantId; if (Guid.TryParse(tenantIdOrName, out tenantId)) diff --git a/src/Volo.Abp.MultiTenancy/Volo/Abp/MultiTenancy/Tenant.cs b/src/Volo.Abp.MultiTenancy/Volo/Abp/MultiTenancy/Tenant.cs new file mode 100644 index 0000000000..ffaa37181f --- /dev/null +++ b/src/Volo.Abp.MultiTenancy/Volo/Abp/MultiTenancy/Tenant.cs @@ -0,0 +1,40 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using JetBrains.Annotations; +using Volo.Abp.Domain.Entities; + +namespace Volo.Abp.MultiTenancy +{ + public class Tenant : AggregateRoot + { + public string Name { get; protected set; } + + public List ConnectionStrings { get; protected set; } + + protected Tenant() + { + + } + + public Tenant(Guid id, [NotNull] string name) + { + Id = id; + Name = name; + + ConnectionStrings = new List(); + } + + [CanBeNull] + public virtual string FindDefaultConnectionString() + { + return FindConnectionString(Data.ConnectionStrings.DefaultConnectionStringName); + } + + [CanBeNull] + public virtual string FindConnectionString(string name) + { + return ConnectionStrings.FirstOrDefault(c => c.Name == name)?.Value; + } + } +} \ No newline at end of file diff --git a/src/Volo.Abp.MultiTenancy/Volo/Abp/MultiTenancy/TenantConnectionString.cs b/src/Volo.Abp.MultiTenancy/Volo/Abp/MultiTenancy/TenantConnectionString.cs new file mode 100644 index 0000000000..4be2075df7 --- /dev/null +++ b/src/Volo.Abp.MultiTenancy/Volo/Abp/MultiTenancy/TenantConnectionString.cs @@ -0,0 +1,30 @@ +using System; +using JetBrains.Annotations; +using Volo.Abp.Domain.Entities; + +namespace Volo.Abp.MultiTenancy +{ + public class TenantConnectionString : Entity + { + public virtual Guid TenantId { get; protected set; } + + public virtual string Name { get; protected set; } + + public virtual string Value { get; protected set; } + + protected TenantConnectionString() + { + + } + + public TenantConnectionString(Guid tenantId, [NotNull] string name, [NotNull] string value) + { + Check.NotNull(name, nameof(name)); + Check.NotNull(value, nameof(value)); + + TenantId = tenantId; + Name = name; + Value = value; + } + } +} \ No newline at end of file diff --git a/src/Volo.Abp.MultiTenancy/Volo/Abp/MultiTenancy/TenantInformation.cs b/src/Volo.Abp.MultiTenancy/Volo/Abp/MultiTenancy/TenantInformation.cs deleted file mode 100644 index b109c35ad2..0000000000 --- a/src/Volo.Abp.MultiTenancy/Volo/Abp/MultiTenancy/TenantInformation.cs +++ /dev/null @@ -1,28 +0,0 @@ -using System; -using JetBrains.Annotations; -using Volo.Abp.Data; - -namespace Volo.Abp.MultiTenancy -{ - public class TenantInformation - { - public Guid Id { get; protected set; } - - public string Name { get; protected set; } - - public ConnectionStrings ConnectionStrings { get; protected set; } - - protected TenantInformation() - { - - } - - public TenantInformation(Guid id, [NotNull] string name) - { - Id = id; - Name = name; - - ConnectionStrings = new ConnectionStrings(); - } - } -} \ No newline at end of file diff --git a/src/Volo.Abp.MultiTenancy/Volo/Abp/MultiTenancy/TenantScope.cs b/src/Volo.Abp.MultiTenancy/Volo/Abp/MultiTenancy/TenantScope.cs index fdb1411c00..538ee484a3 100644 --- a/src/Volo.Abp.MultiTenancy/Volo/Abp/MultiTenancy/TenantScope.cs +++ b/src/Volo.Abp.MultiTenancy/Volo/Abp/MultiTenancy/TenantScope.cs @@ -9,9 +9,9 @@ namespace Volo.Abp.MultiTenancy /// Not null value for a tenant. /// [CanBeNull] - public TenantInformation Tenant { get; } + public Tenant Tenant { get; } - public TenantScope([CanBeNull] TenantInformation tenant) + public TenantScope([CanBeNull] Tenant tenant) { Tenant = tenant; } diff --git a/test/Volo.Abp.AspNetCore.MultiTenancy.Tests/Volo/Abp/AspNetCore/App/AppModule.cs b/test/Volo.Abp.AspNetCore.MultiTenancy.Tests/Volo/Abp/AspNetCore/App/AppModule.cs index 4ac8682e42..19dd121908 100644 --- a/test/Volo.Abp.AspNetCore.MultiTenancy.Tests/Volo/Abp/AspNetCore/App/AppModule.cs +++ b/test/Volo.Abp.AspNetCore.MultiTenancy.Tests/Volo/Abp/AspNetCore/App/AppModule.cs @@ -19,7 +19,7 @@ namespace Volo.Abp.AspNetCore.App { public override void ConfigureServices(IServiceCollection services) { - services.Configure(options => + services.Configure(options => { options.AddDomainTenantResolver("{0}.abp.io"); }); @@ -28,7 +28,7 @@ namespace Volo.Abp.AspNetCore.App public override void OnApplicationInitialization(ApplicationInitializationContext context) { var app = context.GetApplicationBuilder(); - + app.Run(async (ctx) => { var manager = ctx.RequestServices.GetRequiredService(); diff --git a/test/Volo.Abp.AspNetCore.MultiTenancy.Tests/Volo/Abp/AspNetCore/MultiTenancy/AspNetCoreMultiTenancy_Tests.cs b/test/Volo.Abp.AspNetCore.MultiTenancy.Tests/Volo/Abp/AspNetCore/MultiTenancy/AspNetCoreMultiTenancy_Tests.cs index ad54e1bf19..7e33f0a2d1 100644 --- a/test/Volo.Abp.AspNetCore.MultiTenancy.Tests/Volo/Abp/AspNetCore/MultiTenancy/AspNetCoreMultiTenancy_Tests.cs +++ b/test/Volo.Abp.AspNetCore.MultiTenancy.Tests/Volo/Abp/AspNetCore/MultiTenancy/AspNetCoreMultiTenancy_Tests.cs @@ -31,7 +31,7 @@ namespace Volo.Abp.AspNetCore.MultiTenancy { options.Tenants = new[] { - new TenantInformation(_testTenantId, _testTenantName) + new Tenant(_testTenantId, _testTenantName) }; }); }); diff --git a/test/Volo.Abp.MultiTenancy.Tests/Volo/Abp/Data/MultiTenancy/MultiTenantConnectionStringResolver_Tests.cs b/test/Volo.Abp.MultiTenancy.Tests/Volo/Abp/Data/MultiTenancy/MultiTenantConnectionStringResolver_Tests.cs index fbaa5a42f8..a3060abbf5 100644 --- a/test/Volo.Abp.MultiTenancy.Tests/Volo/Abp/Data/MultiTenancy/MultiTenantConnectionStringResolver_Tests.cs +++ b/test/Volo.Abp.MultiTenancy.Tests/Volo/Abp/Data/MultiTenancy/MultiTenantConnectionStringResolver_Tests.cs @@ -1,4 +1,5 @@ using System; +using System.Collections.Generic; using Microsoft.Extensions.DependencyInjection; using Shouldly; using Volo.Abp.MultiTenancy; @@ -29,17 +30,18 @@ namespace Volo.Abp.Data.MultiTenancy services.Configure(options => { + var tenant1Id = Guid.NewGuid(); options.Tenants = new[] { - new TenantInformation(Guid.NewGuid(), "tenant1") + new Tenant(tenant1Id, "tenant1") { ConnectionStrings = { - { ConnectionStrings.DefaultConnectionStringName, "tenant1-default-value" }, - { "db1", "tenant1-db1-value" } + new TenantConnectionString(tenant1Id,ConnectionStrings.DefaultConnectionStringName, "tenant1-default-value"), + new TenantConnectionString(tenant1Id,"db1", "tenant1-db1-value") } }, - new TenantInformation(Guid.NewGuid(), "tenant2") + new Tenant(Guid.NewGuid(), "tenant2") }; }); } diff --git a/test/Volo.Abp.MultiTenancy.Tests/Volo/Abp/MultiTenancy/MultiTenantManager_Tests.cs b/test/Volo.Abp.MultiTenancy.Tests/Volo/Abp/MultiTenancy/MultiTenantManager_Tests.cs index 93ab9ca47b..b34f5be7b5 100644 --- a/test/Volo.Abp.MultiTenancy.Tests/Volo/Abp/MultiTenancy/MultiTenantManager_Tests.cs +++ b/test/Volo.Abp.MultiTenancy.Tests/Volo/Abp/MultiTenancy/MultiTenantManager_Tests.cs @@ -32,15 +32,15 @@ namespace Volo.Abp.MultiTenancy { options.Tenants = new[] { - new TenantInformation(Guid.NewGuid(), _tenantA), - new TenantInformation(Guid.NewGuid(), _tenantB) + new Tenant(Guid.NewGuid(), _tenantA), + new Tenant(Guid.NewGuid(), _tenantB) }; }); } protected override void AfterAddApplication(IServiceCollection services) { - services.Configure(options => + services.Configure(options => { options.TenantResolvers.Add(new ActionTenantResolver(context => {