Browse Source

Refactoring multitenancy module.

pull/189/head
Halil İbrahim Kalkan 9 years ago
parent
commit
7259155a98
  1. 7
      Volo.Abp.sln
  2. 8
      docs/Multi-Tenancy.md
  3. 28
      src/AbpDesk/AbpDesk.ConsoleDemo/appsettings.json
  4. 4
      src/AbpDesk/AbpDesk.Web.Mvc/AbpDeskWebMvcModule.cs
  5. 2
      src/Volo.Abp.AspNetCore.MultiTenancy/Volo/Abp/AspNetCore/MultiTenancy/AbpAspNetCoreMultiTenancyModule.cs
  6. 2
      src/Volo.Abp.AspNetCore.MultiTenancy/Volo/Abp/MultiTenancy/MultiTenancyOptionsExtensions.cs
  7. 0
      src/Volo.Abp.MultiTenancy.Abstractions/Volo/Abp/MultiTenancy/ActionTenantResolver.cs
  8. 0
      src/Volo.Abp.MultiTenancy.Abstractions/Volo/Abp/MultiTenancy/ITenantResolveContext.cs
  9. 0
      src/Volo.Abp.MultiTenancy.Abstractions/Volo/Abp/MultiTenancy/ITenantResolver.cs
  10. 2
      src/Volo.Abp.MultiTenancy.Abstractions/Volo/Abp/MultiTenancy/TenantResolveContext.cs
  11. 4
      src/Volo.Abp.MultiTenancy.Abstractions/Volo/Abp/MultiTenancy/TenantResolveOptions.cs
  12. 1
      src/Volo.Abp.MultiTenancy/Volo.Abp.MultiTenancy.csproj
  13. 6
      src/Volo.Abp.MultiTenancy/Volo/Abp/Data/MultiTenancy/MultiTenantConnectionStringResolver.cs
  14. 3
      src/Volo.Abp.MultiTenancy/Volo/Abp/MultiTenancy/AbpMultiTenancyModule.cs
  15. 2
      src/Volo.Abp.MultiTenancy/Volo/Abp/MultiTenancy/AsyncLocalTenantScopeProvider.cs
  16. 4
      src/Volo.Abp.MultiTenancy/Volo/Abp/MultiTenancy/ConfigurationTenantStore.cs
  17. 4
      src/Volo.Abp.MultiTenancy/Volo/Abp/MultiTenancy/ConfigurationTenantStoreOptions.cs
  18. 4
      src/Volo.Abp.MultiTenancy/Volo/Abp/MultiTenancy/IMultiTenancyManager.cs
  19. 2
      src/Volo.Abp.MultiTenancy/Volo/Abp/MultiTenancy/ITenantScopeProvider.cs
  20. 4
      src/Volo.Abp.MultiTenancy/Volo/Abp/MultiTenancy/ITenantStore.cs
  21. 14
      src/Volo.Abp.MultiTenancy/Volo/Abp/MultiTenancy/MultiTenancyManager.cs
  22. 40
      src/Volo.Abp.MultiTenancy/Volo/Abp/MultiTenancy/Tenant.cs
  23. 30
      src/Volo.Abp.MultiTenancy/Volo/Abp/MultiTenancy/TenantConnectionString.cs
  24. 28
      src/Volo.Abp.MultiTenancy/Volo/Abp/MultiTenancy/TenantInformation.cs
  25. 4
      src/Volo.Abp.MultiTenancy/Volo/Abp/MultiTenancy/TenantScope.cs
  26. 4
      test/Volo.Abp.AspNetCore.MultiTenancy.Tests/Volo/Abp/AspNetCore/App/AppModule.cs
  27. 2
      test/Volo.Abp.AspNetCore.MultiTenancy.Tests/Volo/Abp/AspNetCore/MultiTenancy/AspNetCoreMultiTenancy_Tests.cs
  28. 10
      test/Volo.Abp.MultiTenancy.Tests/Volo/Abp/Data/MultiTenancy/MultiTenantConnectionStringResolver_Tests.cs
  29. 6
      test/Volo.Abp.MultiTenancy.Tests/Volo/Abp/MultiTenancy/MultiTenantManager_Tests.cs

7
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}

8
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<MultiTenancyOptions>(options =>
services.Configure<TenantResolveOptions>(options =>
{
options.TenantResolvers.Add(new MyCustomTenantResolver());
});
@ -330,7 +330,7 @@ services.Configure<AspNetCoreMultiTenancyOptions>(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<MultiTenancyOptions>(options =>
services.Configure<TenantResolveOptions>(options =>
{
//Subdomain format: {0}.mydomain.com (adding as the highest priority resolver)
options.TenantResolvers.Insert(0, new DomainTenantResolver("{0}.mydomain.com"));

28
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": "..."
}
]
}
]
}

4
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"
)

2
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<MultiTenancyOptions>(options =>
services.Configure<TenantResolveOptions>(options =>
{
options.TenantResolvers.Insert(0, new QueryStringTenantResolver());
options.TenantResolvers.Insert(1, new RouteTenantResolver());

2
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));
}

0
src/Volo.Abp.MultiTenancy/Volo/Abp/MultiTenancy/ActionTenantResolver.cs → src/Volo.Abp.MultiTenancy.Abstractions/Volo/Abp/MultiTenancy/ActionTenantResolver.cs

0
src/Volo.Abp.MultiTenancy/Volo/Abp/MultiTenancy/ITenantResolveContext.cs → src/Volo.Abp.MultiTenancy.Abstractions/Volo/Abp/MultiTenancy/ITenantResolveContext.cs

0
src/Volo.Abp.MultiTenancy/Volo/Abp/MultiTenancy/ITenantResolver.cs → src/Volo.Abp.MultiTenancy.Abstractions/Volo/Abp/MultiTenancy/ITenantResolver.cs

2
src/Volo.Abp.MultiTenancy/Volo/Abp/MultiTenancy/TenantResolveContext.cs → 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;
}

4
src/Volo.Abp.MultiTenancy/Volo/Abp/MultiTenancy/MultiTenancyOptions.cs → 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<ITenantResolver> TenantResolvers { get; }
public MultiTenancyOptions()
public TenantResolveOptions()
{
TenantResolvers = new List<ITenantResolver>();
}

1
src/Volo.Abp.MultiTenancy/Volo.Abp.MultiTenancy.csproj

@ -15,6 +15,7 @@
<ItemGroup>
<ProjectReference Include="..\Volo.Abp.Data\Volo.Abp.Data.csproj" />
<ProjectReference Include="..\Volo.Abp.Ddd\Volo.Abp.Ddd.csproj" />
<ProjectReference Include="..\Volo.Abp.MultiTenancy.Abstractions\Volo.Abp.MultiTenancy.Abstractions.csproj" />
</ItemGroup>

6
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;
}
}

3
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)
{

2
src/Volo.Abp.MultiTenancy/Volo/Abp/MultiTenancy/AsyncLocalTenantScopeProvider.cs

@ -19,7 +19,7 @@ namespace Volo.Abp.MultiTenancy
_currentScope = new AsyncLocal<TenantScope>();
}
public IDisposable EnterScope(TenantInformation tenant)
public IDisposable EnterScope(Tenant tenant)
{
var parentScope = CurrentScope;
CurrentScope = new TenantScope(tenant);

4
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);
}

4
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];
}
}
}

4
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);

2
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);
}
}

4
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);
}
}

14
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<MultiTenancyManager> _logger;
public MultiTenancyManager(
IServiceProvider serviceProvider,
ITenantScopeProvider tenantScopeProvider,
IOptions<MultiTenancyOptions> options,
IOptions<TenantResolveOptions> options,
ITenantStore tenantStore,
ILogger<MultiTenancyManager> 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))

40
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<TenantConnectionString> ConnectionStrings { get; protected set; }
protected Tenant()
{
}
public Tenant(Guid id, [NotNull] string name)
{
Id = id;
Name = name;
ConnectionStrings = new List<TenantConnectionString>();
}
[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;
}
}
}

30
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;
}
}
}

28
src/Volo.Abp.MultiTenancy/Volo/Abp/MultiTenancy/TenantInformation.cs

@ -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();
}
}
}

4
src/Volo.Abp.MultiTenancy/Volo/Abp/MultiTenancy/TenantScope.cs

@ -9,9 +9,9 @@ namespace Volo.Abp.MultiTenancy
/// Not null value for a tenant.
/// </summary>
[CanBeNull]
public TenantInformation Tenant { get; }
public Tenant Tenant { get; }
public TenantScope([CanBeNull] TenantInformation tenant)
public TenantScope([CanBeNull] Tenant tenant)
{
Tenant = tenant;
}

4
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<MultiTenancyOptions>(options =>
services.Configure<TenantResolveOptions>(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<IMultiTenancyManager>();

2
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)
};
});
});

10
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<ConfigurationTenantStoreOptions>(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")
};
});
}

6
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<MultiTenancyOptions>(options =>
services.Configure<TenantResolveOptions>(options =>
{
options.TenantResolvers.Add(new ActionTenantResolver(context =>
{

Loading…
Cancel
Save