From 25bf043c8e4f66d7f24da4c8420c4c51c104e636 Mon Sep 17 00:00:00 2001 From: Halil ibrahim Kalkan Date: Tue, 26 Mar 2019 17:44:00 +0300 Subject: [PATCH] Introduce ITenantResolveResultAccessor. --- .../CookieTenantResolveContributor.cs | 4 ++ .../DomainTenantResolveContributor.cs | 4 ++ .../HeaderTenantResolveContributor.cs | 4 ++ .../HttpContextTenantResolveResultAccessor.cs | 40 +++++++++++++++++++ .../HttpTenantResolveContributerBase.cs | 4 +- .../ITenantResolveResultAccessor.cs | 9 +++++ .../MultiTenancy/MultiTenancyMiddleware.cs | 35 ++++++++-------- .../QueryStringTenantResolveContributor.cs | 4 ++ .../RouteTenantResolveContributor.cs | 4 ++ .../Mvc/UI/MultiTenancy/Localization/en.json | 4 +- .../Mvc/UI/MultiTenancy/Localization/tr.json | 4 +- .../ActionTenantResolveContributor.cs | 8 +++- ....cs => AsyncLocalCurrentTenantAccessor.cs} | 4 +- ...ClaimsPrincipalTenantResolveContributor.cs | 8 +++- .../Volo/Abp/MultiTenancy/CurrentTenant.cs | 16 ++++---- .../MultiTenancy/ICurrentTenantAccessor.cs | 12 ++++++ .../MultiTenancy/ICurrentTenantIdAccessor.cs | 13 ------ .../MultiTenancy/ITenantResolveContributor.cs | 2 + .../Volo/Abp/MultiTenancy/ITenantResolver.cs | 4 +- .../TenantResolveContributorBase.cs | 10 +++++ .../Abp/MultiTenancy/TenantResolveResult.cs | 16 ++++++++ .../Volo/Abp/MultiTenancy/TenantResolver.cs | 18 ++++----- 22 files changed, 166 insertions(+), 61 deletions(-) create mode 100644 framework/src/Volo.Abp.AspNetCore.MultiTenancy/Volo/Abp/AspNetCore/MultiTenancy/HttpContextTenantResolveResultAccessor.cs create mode 100644 framework/src/Volo.Abp.AspNetCore.MultiTenancy/Volo/Abp/AspNetCore/MultiTenancy/ITenantResolveResultAccessor.cs rename framework/src/Volo.Abp.MultiTenancy/Volo/Abp/MultiTenancy/{AsyncLocalCurrentTenantIdAccessor.cs => AsyncLocalCurrentTenantAccessor.cs} (72%) create mode 100644 framework/src/Volo.Abp.MultiTenancy/Volo/Abp/MultiTenancy/ICurrentTenantAccessor.cs delete mode 100644 framework/src/Volo.Abp.MultiTenancy/Volo/Abp/MultiTenancy/ICurrentTenantIdAccessor.cs create mode 100644 framework/src/Volo.Abp.MultiTenancy/Volo/Abp/MultiTenancy/TenantResolveContributorBase.cs create mode 100644 framework/src/Volo.Abp.MultiTenancy/Volo/Abp/MultiTenancy/TenantResolveResult.cs diff --git a/framework/src/Volo.Abp.AspNetCore.MultiTenancy/Volo/Abp/AspNetCore/MultiTenancy/CookieTenantResolveContributor.cs b/framework/src/Volo.Abp.AspNetCore.MultiTenancy/Volo/Abp/AspNetCore/MultiTenancy/CookieTenantResolveContributor.cs index 5b27a9d93c..3de810a203 100644 --- a/framework/src/Volo.Abp.AspNetCore.MultiTenancy/Volo/Abp/AspNetCore/MultiTenancy/CookieTenantResolveContributor.cs +++ b/framework/src/Volo.Abp.AspNetCore.MultiTenancy/Volo/Abp/AspNetCore/MultiTenancy/CookieTenantResolveContributor.cs @@ -5,6 +5,10 @@ namespace Volo.Abp.AspNetCore.MultiTenancy { public class CookieTenantResolveContributor : HttpTenantResolveContributorBase { + public const string ContributorName = "Cookie"; + + public override string Name => ContributorName; + protected override string GetTenantIdOrNameFromHttpContextOrNull(ITenantResolveContext context, HttpContext httpContext) { return httpContext.Request?.Cookies[context.GetAspNetCoreMultiTenancyOptions().TenantKey]; diff --git a/framework/src/Volo.Abp.AspNetCore.MultiTenancy/Volo/Abp/AspNetCore/MultiTenancy/DomainTenantResolveContributor.cs b/framework/src/Volo.Abp.AspNetCore.MultiTenancy/Volo/Abp/AspNetCore/MultiTenancy/DomainTenantResolveContributor.cs index 61d47abcfd..90cf3bfa81 100644 --- a/framework/src/Volo.Abp.AspNetCore.MultiTenancy/Volo/Abp/AspNetCore/MultiTenancy/DomainTenantResolveContributor.cs +++ b/framework/src/Volo.Abp.AspNetCore.MultiTenancy/Volo/Abp/AspNetCore/MultiTenancy/DomainTenantResolveContributor.cs @@ -9,6 +9,10 @@ namespace Volo.Abp.AspNetCore.MultiTenancy public class DomainTenantResolveContributor : HttpTenantResolveContributorBase { + public const string ContributorName = "Domain"; + + public override string Name => ContributorName; + private static readonly string[] ProtocolPrefixes = { "http://", "https://" }; private readonly string _domainFormat; diff --git a/framework/src/Volo.Abp.AspNetCore.MultiTenancy/Volo/Abp/AspNetCore/MultiTenancy/HeaderTenantResolveContributor.cs b/framework/src/Volo.Abp.AspNetCore.MultiTenancy/Volo/Abp/AspNetCore/MultiTenancy/HeaderTenantResolveContributor.cs index 3f5e93bd36..0e93d8f8d0 100644 --- a/framework/src/Volo.Abp.AspNetCore.MultiTenancy/Volo/Abp/AspNetCore/MultiTenancy/HeaderTenantResolveContributor.cs +++ b/framework/src/Volo.Abp.AspNetCore.MultiTenancy/Volo/Abp/AspNetCore/MultiTenancy/HeaderTenantResolveContributor.cs @@ -9,6 +9,10 @@ namespace Volo.Abp.AspNetCore.MultiTenancy { public class HeaderTenantResolveContributor : HttpTenantResolveContributorBase { + public const string ContributorName = "Header"; + + public override string Name => ContributorName; + protected override string GetTenantIdOrNameFromHttpContextOrNull(ITenantResolveContext context, HttpContext httpContext) { if (httpContext.Request == null || httpContext.Request.Headers.IsNullOrEmpty()) diff --git a/framework/src/Volo.Abp.AspNetCore.MultiTenancy/Volo/Abp/AspNetCore/MultiTenancy/HttpContextTenantResolveResultAccessor.cs b/framework/src/Volo.Abp.AspNetCore.MultiTenancy/Volo/Abp/AspNetCore/MultiTenancy/HttpContextTenantResolveResultAccessor.cs new file mode 100644 index 0000000000..4865489248 --- /dev/null +++ b/framework/src/Volo.Abp.AspNetCore.MultiTenancy/Volo/Abp/AspNetCore/MultiTenancy/HttpContextTenantResolveResultAccessor.cs @@ -0,0 +1,40 @@ +using JetBrains.Annotations; +using Microsoft.AspNetCore.Http; +using Volo.Abp.DependencyInjection; +using Volo.Abp.MultiTenancy; + +namespace Volo.Abp.AspNetCore.MultiTenancy +{ + public class HttpContextTenantResolveResultAccessor : ITenantResolveResultAccessor, ITransientDependency + { + [CanBeNull] + public TenantResolveResult Result + { + get + { + if (_httpContextAccessor.HttpContext == null) + { + return null; + } + + return _httpContextAccessor.HttpContext.Items[""] as TenantResolveResult; + } + set + { + if (_httpContextAccessor.HttpContext == null) + { + return; + } + + _httpContextAccessor.HttpContext.Items[""] = value; + } + } + + private readonly IHttpContextAccessor _httpContextAccessor; + + public HttpContextTenantResolveResultAccessor(IHttpContextAccessor httpContextAccessor) + { + _httpContextAccessor = httpContextAccessor; + } + } +} \ No newline at end of file diff --git a/framework/src/Volo.Abp.AspNetCore.MultiTenancy/Volo/Abp/AspNetCore/MultiTenancy/HttpTenantResolveContributerBase.cs b/framework/src/Volo.Abp.AspNetCore.MultiTenancy/Volo/Abp/AspNetCore/MultiTenancy/HttpTenantResolveContributerBase.cs index d2971063a5..a5cfbffeb7 100644 --- a/framework/src/Volo.Abp.AspNetCore.MultiTenancy/Volo/Abp/AspNetCore/MultiTenancy/HttpTenantResolveContributerBase.cs +++ b/framework/src/Volo.Abp.AspNetCore.MultiTenancy/Volo/Abp/AspNetCore/MultiTenancy/HttpTenantResolveContributerBase.cs @@ -7,9 +7,9 @@ using Volo.Abp.MultiTenancy; namespace Volo.Abp.AspNetCore.MultiTenancy { - public abstract class HttpTenantResolveContributorBase : ITenantResolveContributor + public abstract class HttpTenantResolveContributorBase : TenantResolveContributorBase { - public virtual void Resolve(ITenantResolveContext context) + public override void Resolve(ITenantResolveContext context) { var httpContext = context.GetHttpContext(); if (httpContext == null) diff --git a/framework/src/Volo.Abp.AspNetCore.MultiTenancy/Volo/Abp/AspNetCore/MultiTenancy/ITenantResolveResultAccessor.cs b/framework/src/Volo.Abp.AspNetCore.MultiTenancy/Volo/Abp/AspNetCore/MultiTenancy/ITenantResolveResultAccessor.cs new file mode 100644 index 0000000000..90201dcf2d --- /dev/null +++ b/framework/src/Volo.Abp.AspNetCore.MultiTenancy/Volo/Abp/AspNetCore/MultiTenancy/ITenantResolveResultAccessor.cs @@ -0,0 +1,9 @@ +using Volo.Abp.MultiTenancy; + +namespace Volo.Abp.AspNetCore.MultiTenancy +{ + public interface ITenantResolveResultAccessor + { + TenantResolveResult Result { get; set; } + } +} diff --git a/framework/src/Volo.Abp.AspNetCore.MultiTenancy/Volo/Abp/AspNetCore/MultiTenancy/MultiTenancyMiddleware.cs b/framework/src/Volo.Abp.AspNetCore.MultiTenancy/Volo/Abp/AspNetCore/MultiTenancy/MultiTenancyMiddleware.cs index cc000f68c5..417b0d30b3 100644 --- a/framework/src/Volo.Abp.AspNetCore.MultiTenancy/Volo/Abp/AspNetCore/MultiTenancy/MultiTenancyMiddleware.cs +++ b/framework/src/Volo.Abp.AspNetCore.MultiTenancy/Volo/Abp/AspNetCore/MultiTenancy/MultiTenancyMiddleware.cs @@ -12,43 +12,44 @@ namespace Volo.Abp.AspNetCore.MultiTenancy private readonly ITenantResolver _tenantResolver; private readonly ITenantStore _tenantStore; private readonly ICurrentTenant _currentTenant; + private readonly ITenantResolveResultAccessor _tenantResolveResultAccessor; public MultiTenancyMiddleware( RequestDelegate next, ITenantResolver tenantResolver, ITenantStore tenantStore, - ICurrentTenant currentTenant) + ICurrentTenant currentTenant, + ITenantResolveResultAccessor tenantResolveResultAccessor) { _next = next; _tenantResolver = tenantResolver; _tenantStore = tenantStore; _currentTenant = currentTenant; + _tenantResolveResultAccessor = tenantResolveResultAccessor; } public async Task Invoke(HttpContext httpContext) { - var tenant = await ResolveCurrentTenantAsync(); - using (_currentTenant.Change(tenant?.Id, tenant?.Name)) - { - await _next(httpContext); - } - } + var resolveResult = _tenantResolver.ResolveTenantIdOrName(); + _tenantResolveResultAccessor.Result = resolveResult; - private async Task ResolveCurrentTenantAsync() - { - var tenantIdOrName = _tenantResolver.ResolveTenantIdOrName(); - if (tenantIdOrName == null) + TenantConfiguration tenant = null; + if (resolveResult.TenantIdOrName != null) { - return null; + tenant = await FindTenantAsync(resolveResult.TenantIdOrName); + if (tenant == null) + { + //TODO: A better exception? + throw new AbpException( + "There is no tenant with given tenant id or name: " + resolveResult.TenantIdOrName + ); + } } - var tenant = await FindTenantAsync(tenantIdOrName); - if (tenant == null) + using (_currentTenant.Change(tenant?.Id, tenant?.Name)) { - throw new AbpException("There is no tenant with given tenant id or name: " + tenantIdOrName); + await _next(httpContext); } - - return tenant; } private async Task FindTenantAsync(string tenantIdOrName) diff --git a/framework/src/Volo.Abp.AspNetCore.MultiTenancy/Volo/Abp/AspNetCore/MultiTenancy/QueryStringTenantResolveContributor.cs b/framework/src/Volo.Abp.AspNetCore.MultiTenancy/Volo/Abp/AspNetCore/MultiTenancy/QueryStringTenantResolveContributor.cs index 9899e2613e..3dcb4c5140 100644 --- a/framework/src/Volo.Abp.AspNetCore.MultiTenancy/Volo/Abp/AspNetCore/MultiTenancy/QueryStringTenantResolveContributor.cs +++ b/framework/src/Volo.Abp.AspNetCore.MultiTenancy/Volo/Abp/AspNetCore/MultiTenancy/QueryStringTenantResolveContributor.cs @@ -5,6 +5,10 @@ namespace Volo.Abp.AspNetCore.MultiTenancy { public class QueryStringTenantResolveContributor : HttpTenantResolveContributorBase { + public const string ContributorName = "QueryString"; + + public override string Name => ContributorName; + protected override string GetTenantIdOrNameFromHttpContextOrNull(ITenantResolveContext context, HttpContext httpContext) { if (httpContext.Request == null || !httpContext.Request.QueryString.HasValue) diff --git a/framework/src/Volo.Abp.AspNetCore.MultiTenancy/Volo/Abp/AspNetCore/MultiTenancy/RouteTenantResolveContributor.cs b/framework/src/Volo.Abp.AspNetCore.MultiTenancy/Volo/Abp/AspNetCore/MultiTenancy/RouteTenantResolveContributor.cs index 3be155c68d..4d073db9f8 100644 --- a/framework/src/Volo.Abp.AspNetCore.MultiTenancy/Volo/Abp/AspNetCore/MultiTenancy/RouteTenantResolveContributor.cs +++ b/framework/src/Volo.Abp.AspNetCore.MultiTenancy/Volo/Abp/AspNetCore/MultiTenancy/RouteTenantResolveContributor.cs @@ -7,6 +7,10 @@ namespace Volo.Abp.AspNetCore.MultiTenancy { public class RouteTenantResolveContributor : HttpTenantResolveContributorBase { + public const string ContributorName = "Route"; + + public override string Name => ContributorName; + protected override string GetTenantIdOrNameFromHttpContextOrNull(ITenantResolveContext context, HttpContext httpContext) { var tenantId = httpContext.GetRouteValue(context.GetAspNetCoreMultiTenancyOptions().TenantKey); diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.MultiTenancy/Volo/Abp/AspNetCore/Mvc/UI/MultiTenancy/Localization/en.json b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.MultiTenancy/Volo/Abp/AspNetCore/Mvc/UI/MultiTenancy/Localization/en.json index a934bc87b0..75c001dc88 100644 --- a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.MultiTenancy/Volo/Abp/AspNetCore/Mvc/UI/MultiTenancy/Localization/en.json +++ b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.MultiTenancy/Volo/Abp/AspNetCore/Mvc/UI/MultiTenancy/Localization/en.json @@ -3,9 +3,9 @@ "texts": { "GivenTenantIsNotAvailable": "Given tenant is not available: {0}", "Tenant": "Tenant", - "Switch": "Switch", + "Switch": "switch", "Name": "Name", "SwitchTenantHint": "Leave the name field blank to switch to the host side.", - "NotSelected": "Seçili değil" + "NotSelected": "Not selected" } } \ No newline at end of file diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.MultiTenancy/Volo/Abp/AspNetCore/Mvc/UI/MultiTenancy/Localization/tr.json b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.MultiTenancy/Volo/Abp/AspNetCore/Mvc/UI/MultiTenancy/Localization/tr.json index 93cf964f6f..150af9a825 100644 --- a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.MultiTenancy/Volo/Abp/AspNetCore/Mvc/UI/MultiTenancy/Localization/tr.json +++ b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.MultiTenancy/Volo/Abp/AspNetCore/Mvc/UI/MultiTenancy/Localization/tr.json @@ -3,9 +3,9 @@ "texts": { "GivenTenantIsNotAvailable": "İstenilen müşteri bulunamadı: {0}", "Tenant": "Müşteri", - "Switch": "Değiştir", + "Switch": "değiştir", "Name": "İsim", "SwitchTenantHint": "Host tarafına geçmek için isim alanını boş bırakın.", - "NotSelected": "Not selected" + "NotSelected": "Seçili değil" } } \ No newline at end of file diff --git a/framework/src/Volo.Abp.MultiTenancy/Volo/Abp/MultiTenancy/ActionTenantResolveContributor.cs b/framework/src/Volo.Abp.MultiTenancy/Volo/Abp/MultiTenancy/ActionTenantResolveContributor.cs index ac2cdeee5a..c73075107e 100644 --- a/framework/src/Volo.Abp.MultiTenancy/Volo/Abp/MultiTenancy/ActionTenantResolveContributor.cs +++ b/framework/src/Volo.Abp.MultiTenancy/Volo/Abp/MultiTenancy/ActionTenantResolveContributor.cs @@ -3,8 +3,12 @@ using JetBrains.Annotations; namespace Volo.Abp.MultiTenancy { - public class ActionTenantResolveContributor : ITenantResolveContributor + public class ActionTenantResolveContributor : TenantResolveContributorBase { + public const string ContributorName = "Action"; + + public override string Name => ContributorName; + private readonly Action _resolveAction; public ActionTenantResolveContributor([NotNull] Action resolveAction) @@ -14,7 +18,7 @@ namespace Volo.Abp.MultiTenancy _resolveAction = resolveAction; } - public void Resolve(ITenantResolveContext context) + public override void Resolve(ITenantResolveContext context) { _resolveAction(context); } diff --git a/framework/src/Volo.Abp.MultiTenancy/Volo/Abp/MultiTenancy/AsyncLocalCurrentTenantIdAccessor.cs b/framework/src/Volo.Abp.MultiTenancy/Volo/Abp/MultiTenancy/AsyncLocalCurrentTenantAccessor.cs similarity index 72% rename from framework/src/Volo.Abp.MultiTenancy/Volo/Abp/MultiTenancy/AsyncLocalCurrentTenantIdAccessor.cs rename to framework/src/Volo.Abp.MultiTenancy/Volo/Abp/MultiTenancy/AsyncLocalCurrentTenantAccessor.cs index 6031e4efd2..32f7fc0782 100644 --- a/framework/src/Volo.Abp.MultiTenancy/Volo/Abp/MultiTenancy/AsyncLocalCurrentTenantIdAccessor.cs +++ b/framework/src/Volo.Abp.MultiTenancy/Volo/Abp/MultiTenancy/AsyncLocalCurrentTenantAccessor.cs @@ -3,7 +3,7 @@ using Volo.Abp.DependencyInjection; namespace Volo.Abp.MultiTenancy { - public class AsyncLocalCurrentTenantIdAccessor : ICurrentTenantIdAccessor, ISingletonDependency + public class AsyncLocalCurrentTenantAccessor : ICurrentTenantAccessor, ISingletonDependency { public BasicTenantInfo Current { @@ -13,7 +13,7 @@ namespace Volo.Abp.MultiTenancy private readonly AsyncLocal _currentScope; - public AsyncLocalCurrentTenantIdAccessor() + public AsyncLocalCurrentTenantAccessor() { _currentScope = new AsyncLocal(); } diff --git a/framework/src/Volo.Abp.MultiTenancy/Volo/Abp/MultiTenancy/CurrentClaimsPrincipalTenantResolveContributor.cs b/framework/src/Volo.Abp.MultiTenancy/Volo/Abp/MultiTenancy/CurrentClaimsPrincipalTenantResolveContributor.cs index 425f6dcc1b..0f213ea1d7 100644 --- a/framework/src/Volo.Abp.MultiTenancy/Volo/Abp/MultiTenancy/CurrentClaimsPrincipalTenantResolveContributor.cs +++ b/framework/src/Volo.Abp.MultiTenancy/Volo/Abp/MultiTenancy/CurrentClaimsPrincipalTenantResolveContributor.cs @@ -4,9 +4,13 @@ using Volo.Abp.Security.Claims; namespace Volo.Abp.MultiTenancy { - public class CurrentClaimsPrincipalTenantResolveContributor : ITenantResolveContributor + public class CurrentClaimsPrincipalTenantResolveContributor : TenantResolveContributorBase { - public void Resolve(ITenantResolveContext context) + public const string ContributorName = "CurrentClaims"; + + public override string Name => ContributorName; + + public override void Resolve(ITenantResolveContext context) { var principal = context.ServiceProvider.GetRequiredService().Principal; if (principal?.Identity?.IsAuthenticated != true) diff --git a/framework/src/Volo.Abp.MultiTenancy/Volo/Abp/MultiTenancy/CurrentTenant.cs b/framework/src/Volo.Abp.MultiTenancy/Volo/Abp/MultiTenancy/CurrentTenant.cs index a286f5549c..4cd6ae9527 100644 --- a/framework/src/Volo.Abp.MultiTenancy/Volo/Abp/MultiTenancy/CurrentTenant.cs +++ b/framework/src/Volo.Abp.MultiTenancy/Volo/Abp/MultiTenancy/CurrentTenant.cs @@ -7,15 +7,15 @@ namespace Volo.Abp.MultiTenancy { public virtual bool IsAvailable => Id.HasValue; - public virtual Guid? Id => _currentTenantIdAccessor.Current?.TenantId; + public virtual Guid? Id => _currentTenantAccessor.Current?.TenantId; - public string Name => _currentTenantIdAccessor.Current?.Name; + public string Name => _currentTenantAccessor.Current?.Name; - private readonly ICurrentTenantIdAccessor _currentTenantIdAccessor; + private readonly ICurrentTenantAccessor _currentTenantAccessor; - public CurrentTenant(ICurrentTenantIdAccessor currentTenantIdAccessor) + public CurrentTenant(ICurrentTenantAccessor currentTenantAccessor) { - _currentTenantIdAccessor = currentTenantIdAccessor; + _currentTenantAccessor = currentTenantAccessor; } public IDisposable Change(Guid? id, string name = null) @@ -25,11 +25,11 @@ namespace Volo.Abp.MultiTenancy private IDisposable SetCurrent(Guid? tenantId, string name = null) { - var parentScope = _currentTenantIdAccessor.Current; - _currentTenantIdAccessor.Current = new BasicTenantInfo(tenantId, name); + var parentScope = _currentTenantAccessor.Current; + _currentTenantAccessor.Current = new BasicTenantInfo(tenantId, name); return new DisposeAction(() => { - _currentTenantIdAccessor.Current = parentScope; + _currentTenantAccessor.Current = parentScope; }); } } diff --git a/framework/src/Volo.Abp.MultiTenancy/Volo/Abp/MultiTenancy/ICurrentTenantAccessor.cs b/framework/src/Volo.Abp.MultiTenancy/Volo/Abp/MultiTenancy/ICurrentTenantAccessor.cs new file mode 100644 index 0000000000..76b9b8f0db --- /dev/null +++ b/framework/src/Volo.Abp.MultiTenancy/Volo/Abp/MultiTenancy/ICurrentTenantAccessor.cs @@ -0,0 +1,12 @@ +namespace Volo.Abp.MultiTenancy +{ + /* A null Current indicates that we haven't set it explicitly. + * A null Current.TenantId indicates that we have set null tenant id value explicitly. + * A non-null Current.TenantId indicates that we have set a tenant id value explicitly. + */ + + public interface ICurrentTenantAccessor + { + BasicTenantInfo Current { get; set; } + } +} \ No newline at end of file diff --git a/framework/src/Volo.Abp.MultiTenancy/Volo/Abp/MultiTenancy/ICurrentTenantIdAccessor.cs b/framework/src/Volo.Abp.MultiTenancy/Volo/Abp/MultiTenancy/ICurrentTenantIdAccessor.cs deleted file mode 100644 index ae9fad6433..0000000000 --- a/framework/src/Volo.Abp.MultiTenancy/Volo/Abp/MultiTenancy/ICurrentTenantIdAccessor.cs +++ /dev/null @@ -1,13 +0,0 @@ -namespace Volo.Abp.MultiTenancy -{ - /* Uses TenantScopeTenantInfoWrapper instead of TenantInfo because being null of Current is different that being null of Current.Tenant. - * A null Current indicates that we haven't set it explicitly. - * A null Current.Tenant indicates that we have set null tenant value explicitly. - * A non-null Current.Tenant indicates that we have set a tenant value explicitly. - */ - - public interface ICurrentTenantIdAccessor - { - BasicTenantInfo Current { get; set; } - } -} \ No newline at end of file diff --git a/framework/src/Volo.Abp.MultiTenancy/Volo/Abp/MultiTenancy/ITenantResolveContributor.cs b/framework/src/Volo.Abp.MultiTenancy/Volo/Abp/MultiTenancy/ITenantResolveContributor.cs index bff87d35ab..a79cccfe66 100644 --- a/framework/src/Volo.Abp.MultiTenancy/Volo/Abp/MultiTenancy/ITenantResolveContributor.cs +++ b/framework/src/Volo.Abp.MultiTenancy/Volo/Abp/MultiTenancy/ITenantResolveContributor.cs @@ -2,6 +2,8 @@ namespace Volo.Abp.MultiTenancy { public interface ITenantResolveContributor { + string Name { get; } + void Resolve(ITenantResolveContext context); } } \ No newline at end of file diff --git a/framework/src/Volo.Abp.MultiTenancy/Volo/Abp/MultiTenancy/ITenantResolver.cs b/framework/src/Volo.Abp.MultiTenancy/Volo/Abp/MultiTenancy/ITenantResolver.cs index 35efdd14b0..b9ce83b0b9 100644 --- a/framework/src/Volo.Abp.MultiTenancy/Volo/Abp/MultiTenancy/ITenantResolver.cs +++ b/framework/src/Volo.Abp.MultiTenancy/Volo/Abp/MultiTenancy/ITenantResolver.cs @@ -10,7 +10,7 @@ namespace Volo.Abp.MultiTenancy /// /// Tenant id, unique name or null (if could not resolve). /// - [CanBeNull] - string ResolveTenantIdOrName(); + [NotNull] + TenantResolveResult ResolveTenantIdOrName(); } } \ No newline at end of file diff --git a/framework/src/Volo.Abp.MultiTenancy/Volo/Abp/MultiTenancy/TenantResolveContributorBase.cs b/framework/src/Volo.Abp.MultiTenancy/Volo/Abp/MultiTenancy/TenantResolveContributorBase.cs new file mode 100644 index 0000000000..8fcc22059d --- /dev/null +++ b/framework/src/Volo.Abp.MultiTenancy/Volo/Abp/MultiTenancy/TenantResolveContributorBase.cs @@ -0,0 +1,10 @@ +namespace Volo.Abp.MultiTenancy +{ + public abstract class TenantResolveContributorBase : ITenantResolveContributor + { + public abstract string Name { get; } + + //TODO: We can make this async + public abstract void Resolve(ITenantResolveContext context); + } +} \ No newline at end of file diff --git a/framework/src/Volo.Abp.MultiTenancy/Volo/Abp/MultiTenancy/TenantResolveResult.cs b/framework/src/Volo.Abp.MultiTenancy/Volo/Abp/MultiTenancy/TenantResolveResult.cs new file mode 100644 index 0000000000..6b6c417508 --- /dev/null +++ b/framework/src/Volo.Abp.MultiTenancy/Volo/Abp/MultiTenancy/TenantResolveResult.cs @@ -0,0 +1,16 @@ +using System.Collections.Generic; + +namespace Volo.Abp.MultiTenancy +{ + public class TenantResolveResult + { + public string TenantIdOrName { get; set; } + + public List AppliedResolvers { get; } + + public TenantResolveResult() + { + AppliedResolvers = new List(); + } + } +} \ No newline at end of file diff --git a/framework/src/Volo.Abp.MultiTenancy/Volo/Abp/MultiTenancy/TenantResolver.cs b/framework/src/Volo.Abp.MultiTenancy/Volo/Abp/MultiTenancy/TenantResolver.cs index f47cecd270..cefaf41329 100644 --- a/framework/src/Volo.Abp.MultiTenancy/Volo/Abp/MultiTenancy/TenantResolver.cs +++ b/framework/src/Volo.Abp.MultiTenancy/Volo/Abp/MultiTenancy/TenantResolver.cs @@ -1,5 +1,6 @@ using System; using System.Linq; +using JetBrains.Annotations; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Options; using Volo.Abp.DependencyInjection; @@ -17,12 +18,9 @@ namespace Volo.Abp.MultiTenancy _options = options.Value; } - public string ResolveTenantIdOrName() + public TenantResolveResult ResolveTenantIdOrName() { - if (!_options.TenantResolvers.Any()) - { - return null; - } + var result = new TenantResolveResult(); using (var serviceScope = _serviceProvider.CreateScope()) { @@ -32,15 +30,17 @@ namespace Volo.Abp.MultiTenancy { tenantResolver.Resolve(context); + result.AppliedResolvers.Add(tenantResolver.Name); + if (context.HasResolvedTenantOrHost()) { - return context.TenantIdOrName; + result.TenantIdOrName = context.TenantIdOrName; + break; } } - - //Could not find a tenant - return null; } + + return result; } } } \ No newline at end of file