Browse Source

Extracted TenantResolver from MultiTenancyManager. Renamed old ITenantResolver to ITenantResolveContributor

pull/191/head
Halil İbrahim Kalkan 9 years ago
parent
commit
4099af8cc1
  1. 8
      src/Volo.Abp.AspNetCore.MultiTenancy/Volo/Abp/AspNetCore/MultiTenancy/AbpAspNetCoreMultiTenancyModule.cs
  2. 2
      src/Volo.Abp.AspNetCore.MultiTenancy/Volo/Abp/AspNetCore/MultiTenancy/CookieTenantResolveContributer.cs
  3. 4
      src/Volo.Abp.AspNetCore.MultiTenancy/Volo/Abp/AspNetCore/MultiTenancy/DomainTenantResolveContributer.cs
  4. 4
      src/Volo.Abp.AspNetCore.MultiTenancy/Volo/Abp/AspNetCore/MultiTenancy/HeaderTenantResolveContributer.cs
  5. 4
      src/Volo.Abp.AspNetCore.MultiTenancy/Volo/Abp/AspNetCore/MultiTenancy/HttpTenantResolveContributerBase.cs
  6. 2
      src/Volo.Abp.AspNetCore.MultiTenancy/Volo/Abp/AspNetCore/MultiTenancy/QueryStringTenantResolveContributer.cs
  7. 2
      src/Volo.Abp.AspNetCore.MultiTenancy/Volo/Abp/AspNetCore/MultiTenancy/RouteTenantResolveContributer.cs
  8. 2
      src/Volo.Abp.AspNetCore.MultiTenancy/Volo/Abp/MultiTenancy/MultiTenancyOptionsExtensions.cs
  9. 4
      src/Volo.Abp.MultiTenancy.Abstractions/Volo/Abp/MultiTenancy/ActionTenantResolveContributer.cs
  10. 7
      src/Volo.Abp.MultiTenancy.Abstractions/Volo/Abp/MultiTenancy/ITenantResolveContributer.cs
  11. 11
      src/Volo.Abp.MultiTenancy.Abstractions/Volo/Abp/MultiTenancy/ITenantResolver.cs
  12. 4
      src/Volo.Abp.MultiTenancy.Abstractions/Volo/Abp/MultiTenancy/TenantResolveOptions.cs
  13. 46
      src/Volo.Abp.MultiTenancy.Abstractions/Volo/Abp/MultiTenancy/TenantResolver.cs
  14. 74
      src/Volo.Abp.MultiTenancy.Domain/Volo/Abp/MultiTenancy/MultiTenancyManager.cs
  15. 4
      test/Volo.Abp.MultiTenancy.Tests/Volo/Abp/MultiTenancy/MultiTenantManager_Tests.cs

8
src/Volo.Abp.AspNetCore.MultiTenancy/Volo/Abp/AspNetCore/MultiTenancy/AbpAspNetCoreMultiTenancyModule.cs

@ -11,10 +11,10 @@ namespace Volo.Abp.AspNetCore.MultiTenancy
{
services.Configure<TenantResolveOptions>(options =>
{
options.TenantResolvers.Insert(0, new QueryStringTenantResolver());
options.TenantResolvers.Insert(1, new RouteTenantResolver());
options.TenantResolvers.Insert(2, new HeaderTenantResolver());
options.TenantResolvers.Insert(3, new CookieTenantResolver());
options.TenantResolvers.Insert(0, new QueryStringTenantResolveContributer());
options.TenantResolvers.Insert(1, new RouteTenantResolveContributer());
options.TenantResolvers.Insert(2, new HeaderTenantResolveContributer());
options.TenantResolvers.Insert(3, new CookieTenantResolveContributer());
});
services.AddAssemblyOf<AbpAspNetCoreMultiTenancyModule>();

2
src/Volo.Abp.AspNetCore.MultiTenancy/Volo/Abp/AspNetCore/MultiTenancy/CookieTenantResolver.cs → src/Volo.Abp.AspNetCore.MultiTenancy/Volo/Abp/AspNetCore/MultiTenancy/CookieTenantResolveContributer.cs

@ -3,7 +3,7 @@ using Volo.Abp.MultiTenancy;
namespace Volo.Abp.AspNetCore.MultiTenancy
{
public class CookieTenantResolver : HttpTenantResolverBase
public class CookieTenantResolveContributer : HttpTenantResolveContributerBase
{
protected override string GetTenantIdOrNameFromHttpContextOrNull(ITenantResolveContext context, HttpContext httpContext)
{

4
src/Volo.Abp.AspNetCore.MultiTenancy/Volo/Abp/AspNetCore/MultiTenancy/DomainTenantResolver.cs → src/Volo.Abp.AspNetCore.MultiTenancy/Volo/Abp/AspNetCore/MultiTenancy/DomainTenantResolveContributer.cs

@ -7,11 +7,11 @@ namespace Volo.Abp.AspNetCore.MultiTenancy
{
//TODO: Create a better domain format. We can accept regex for example.
public class DomainTenantResolver : HttpTenantResolverBase
public class DomainTenantResolveContributer : HttpTenantResolveContributerBase
{
private readonly string _domainFormat;
public DomainTenantResolver(string domainFormat)
public DomainTenantResolveContributer(string domainFormat)
{
_domainFormat = domainFormat.RemovePreFix("http://", "https://");
}

4
src/Volo.Abp.AspNetCore.MultiTenancy/Volo/Abp/AspNetCore/MultiTenancy/HeaderTenantResolver.cs → src/Volo.Abp.AspNetCore.MultiTenancy/Volo/Abp/AspNetCore/MultiTenancy/HeaderTenantResolveContributer.cs

@ -8,7 +8,7 @@ using Volo.Abp.MultiTenancy;
namespace Volo.Abp.AspNetCore.MultiTenancy
{
public class HeaderTenantResolver : HttpTenantResolverBase
public class HeaderTenantResolveContributer : HttpTenantResolveContributerBase
{
protected override string GetTenantIdOrNameFromHttpContextOrNull(ITenantResolveContext context, HttpContext httpContext)
{
@ -37,7 +37,7 @@ namespace Volo.Abp.AspNetCore.MultiTenancy
{
context
.ServiceProvider
.GetRequiredService<ILogger<HeaderTenantResolver>>()
.GetRequiredService<ILogger<HeaderTenantResolveContributer>>()
.LogWarning(text);
}
}

4
src/Volo.Abp.AspNetCore.MultiTenancy/Volo/Abp/AspNetCore/MultiTenancy/HttpTenantResolverBase.cs → src/Volo.Abp.AspNetCore.MultiTenancy/Volo/Abp/AspNetCore/MultiTenancy/HttpTenantResolveContributerBase.cs

@ -7,7 +7,7 @@ using Volo.Abp.MultiTenancy;
namespace Volo.Abp.AspNetCore.MultiTenancy
{
public abstract class HttpTenantResolverBase : ITenantResolver
public abstract class HttpTenantResolveContributerBase : ITenantResolveContributer
{
public virtual void Resolve(ITenantResolveContext context)
{
@ -24,7 +24,7 @@ namespace Volo.Abp.AspNetCore.MultiTenancy
catch (Exception e)
{
context.ServiceProvider
.GetRequiredService<ILogger<HttpTenantResolverBase>>()
.GetRequiredService<ILogger<HttpTenantResolveContributerBase>>()
.LogWarning(e.ToString());
}
}

2
src/Volo.Abp.AspNetCore.MultiTenancy/Volo/Abp/AspNetCore/MultiTenancy/QueryStringTenantResolver.cs → src/Volo.Abp.AspNetCore.MultiTenancy/Volo/Abp/AspNetCore/MultiTenancy/QueryStringTenantResolveContributer.cs

@ -3,7 +3,7 @@ using Volo.Abp.MultiTenancy;
namespace Volo.Abp.AspNetCore.MultiTenancy
{
public class QueryStringTenantResolver : HttpTenantResolverBase
public class QueryStringTenantResolveContributer : HttpTenantResolveContributerBase
{
protected override string GetTenantIdOrNameFromHttpContextOrNull(ITenantResolveContext context, HttpContext httpContext)
{

2
src/Volo.Abp.AspNetCore.MultiTenancy/Volo/Abp/AspNetCore/MultiTenancy/RouteTenantResolver.cs → src/Volo.Abp.AspNetCore.MultiTenancy/Volo/Abp/AspNetCore/MultiTenancy/RouteTenantResolveContributer.cs

@ -5,7 +5,7 @@ using Volo.Abp.MultiTenancy;
namespace Volo.Abp.AspNetCore.MultiTenancy
{
public class RouteTenantResolver : HttpTenantResolverBase
public class RouteTenantResolveContributer : HttpTenantResolveContributerBase
{
protected override string GetTenantIdOrNameFromHttpContextOrNull(ITenantResolveContext context, HttpContext httpContext)
{

2
src/Volo.Abp.AspNetCore.MultiTenancy/Volo/Abp/MultiTenancy/MultiTenancyOptionsExtensions.cs

@ -6,7 +6,7 @@ namespace Volo.Abp.MultiTenancy
{
public static void AddDomainTenantResolver(this TenantResolveOptions options, string domainFormat)
{
options.TenantResolvers.Insert(0, new DomainTenantResolver(domainFormat));
options.TenantResolvers.Insert(0, new DomainTenantResolveContributer(domainFormat));
}
}
}

4
src/Volo.Abp.MultiTenancy.Abstractions/Volo/Abp/MultiTenancy/ActionTenantResolver.cs → src/Volo.Abp.MultiTenancy.Abstractions/Volo/Abp/MultiTenancy/ActionTenantResolveContributer.cs

@ -3,11 +3,11 @@ using JetBrains.Annotations;
namespace Volo.Abp.MultiTenancy
{
public class ActionTenantResolver : ITenantResolver
public class ActionTenantResolveContributer : ITenantResolveContributer
{
private readonly Action<ITenantResolveContext> _resolveAction;
public ActionTenantResolver([NotNull] Action<ITenantResolveContext> resolveAction)
public ActionTenantResolveContributer([NotNull] Action<ITenantResolveContext> resolveAction)
{
Check.NotNull(resolveAction, nameof(resolveAction));

7
src/Volo.Abp.MultiTenancy.Abstractions/Volo/Abp/MultiTenancy/ITenantResolveContributer.cs

@ -0,0 +1,7 @@
namespace Volo.Abp.MultiTenancy
{
public interface ITenantResolveContributer
{
void Resolve(ITenantResolveContext context);
}
}

11
src/Volo.Abp.MultiTenancy.Abstractions/Volo/Abp/MultiTenancy/ITenantResolver.cs

@ -1,7 +1,16 @@
using JetBrains.Annotations;
namespace Volo.Abp.MultiTenancy
{
public interface ITenantResolver
{
void Resolve(ITenantResolveContext context);
/// <summary>
/// Tries to resolve current tenant using registered <see cref="ITenantResolveContributer"/> implementations.
/// </summary>
/// <returns>
/// Tenant id, unique name or null (if could not resolve).
/// </returns>
[CanBeNull]
string ResolveTenantIdOrName();
}
}

4
src/Volo.Abp.MultiTenancy.Abstractions/Volo/Abp/MultiTenancy/TenantResolveOptions.cs

@ -6,11 +6,11 @@ namespace Volo.Abp.MultiTenancy
public class TenantResolveOptions
{
[NotNull]
public List<ITenantResolver> TenantResolvers { get; }
public List<ITenantResolveContributer> TenantResolvers { get; }
public TenantResolveOptions()
{
TenantResolvers = new List<ITenantResolver>();
TenantResolvers = new List<ITenantResolveContributer>();
}
}
}

46
src/Volo.Abp.MultiTenancy.Abstractions/Volo/Abp/MultiTenancy/TenantResolver.cs

@ -0,0 +1,46 @@
using System;
using System.Linq;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Options;
using Volo.Abp.DependencyInjection;
namespace Volo.Abp.MultiTenancy
{
public class TenantResolver : ITenantResolver, ITransientDependency
{
private readonly IServiceProvider _serviceProvider;
private readonly TenantResolveOptions _options;
public TenantResolver(IOptions<TenantResolveOptions> options, IServiceProvider serviceProvider)
{
_serviceProvider = serviceProvider;
_options = options.Value;
}
public string ResolveTenantIdOrName()
{
if (!_options.TenantResolvers.Any())
{
return null;
}
using (var serviceScope = _serviceProvider.CreateScope())
{
var context = new TenantResolveContext(serviceScope.ServiceProvider);
foreach (var tenantResolver in _options.TenantResolvers)
{
tenantResolver.Resolve(context);
if (context.HasResolvedTenantOrHost())
{
return context.TenantIdOrName;
}
}
//Could not find a tenant
return null;
}
}
}
}

74
src/Volo.Abp.MultiTenancy.Domain/Volo/Abp/MultiTenancy/MultiTenancyManager.cs

@ -1,9 +1,5 @@
using System;
using System.Linq;
using JetBrains.Annotations;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Options;
using Volo.Abp.DependencyInjection;
namespace Volo.Abp.MultiTenancy
@ -14,24 +10,21 @@ namespace Volo.Abp.MultiTenancy
{
public Tenant CurrentTenant => GetCurrentTenant();
private readonly IServiceProvider _serviceProvider;
private readonly ITenantScopeProvider _tenantScopeProvider;
private readonly ITenantStore _tenantStore;
private readonly TenantResolveOptions _options;
private readonly ILogger<MultiTenancyManager> _logger;
private readonly ITenantResolver _tenantResolver;
public MultiTenancyManager(
IServiceProvider serviceProvider,
ITenantScopeProvider tenantScopeProvider,
IOptions<TenantResolveOptions> options,
ITenantStore tenantStore,
ILogger<MultiTenancyManager> logger)
ITenantStore tenantStore,
ILogger<MultiTenancyManager> logger,
ITenantResolver tenantResolver)
{
_serviceProvider = serviceProvider;
_tenantScopeProvider = tenantScopeProvider;
_tenantStore = tenantStore;
_logger = logger;
_options = options.Value;
_tenantResolver = tenantResolver;
}
public IDisposable ChangeTenant(Guid? tenantId)
@ -75,60 +68,39 @@ namespace Volo.Abp.MultiTenancy
//TODO: Get from ICurrentUser before resolvers and fail if resolvers find a different tenant!
return GetCurrentTenantFromResolvers();
return ResolveTenant();
}
protected virtual Tenant GetCurrentTenantFromResolvers() //TODO: This should go to another class
protected virtual Tenant ResolveTenant()
{
if (!_options.TenantResolvers.Any())
var tenantIdOrName = _tenantResolver.ResolveTenantIdOrName();
if (tenantIdOrName == null)
{
return null;
}
using (var serviceScope = _serviceProvider.CreateScope())
{
var context = new TenantResolveContext(serviceScope.ServiceProvider);
Tenant tenant;
foreach (var tenantResolver in _options.TenantResolvers)
//Try to find by id
if (Guid.TryParse(tenantIdOrName, out var tenantId))
{
tenant = _tenantStore.Find(tenantId);
if (tenant != null)
{
tenantResolver.Resolve(context);
if (context.HasResolvedTenantOrHost())
{
if (context.TenantIdOrName == null)
{
//Resolved host!
return null;
}
var tenant = GetValidatedTenantOrNull(context.TenantIdOrName);
if (tenant != null)
{
return tenant;
}
_logger.LogWarning($"Resolved tenancy name '{context.TenantIdOrName}' by '{tenantResolver.GetType().FullName}' but could not find in current tenant store.");
context.TenantIdOrName = null;
}
context.Handled = false;
return tenant;
}
//Could not find a tenant
return null;
}
}
[CanBeNull]
private Tenant GetValidatedTenantOrNull([NotNull] string tenantIdOrName)
{
Guid tenantId;
if (Guid.TryParse(tenantIdOrName, out tenantId))
//Try to find by name
tenant = _tenantStore.Find(tenantIdOrName);
if (tenant != null)
{
return _tenantStore.Find(tenantId);
return tenant;
}
return _tenantStore.Find(tenantIdOrName);
//Could not found!
_logger.LogWarning($"Resolved tenancy id or name '{tenantIdOrName}' but could not find in the tenant store.");
return null;
}
}
}

4
test/Volo.Abp.MultiTenancy.Tests/Volo/Abp/MultiTenancy/MultiTenantManager_Tests.cs

@ -42,7 +42,7 @@ namespace Volo.Abp.MultiTenancy
{
services.Configure<TenantResolveOptions>(options =>
{
options.TenantResolvers.Add(new ActionTenantResolver(context =>
options.TenantResolvers.Add(new ActionTenantResolveContributer(context =>
{
if (_tenantToBeResolved == _tenantA)
{
@ -50,7 +50,7 @@ namespace Volo.Abp.MultiTenancy
}
}));
options.TenantResolvers.Add(new ActionTenantResolver(context =>
options.TenantResolvers.Add(new ActionTenantResolveContributer(context =>
{
if (_tenantToBeResolved == _tenantB)
{

Loading…
Cancel
Save