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 2c82095dac..0aeb97e89d 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 @@ -1,5 +1,4 @@ -using System; -using System.Threading.Tasks; +using System.Threading.Tasks; using Microsoft.AspNetCore.Http; using Volo.Abp.DependencyInjection; using Volo.Abp.MultiTenancy; @@ -8,59 +7,24 @@ namespace Volo.Abp.AspNetCore.MultiTenancy { public class MultiTenancyMiddleware : IMiddleware, ITransientDependency { - private readonly ITenantResolver _tenantResolver; - private readonly ITenantStore _tenantStore; + private readonly ITenantConfigurationProvider _tenantConfigurationProvider; private readonly ICurrentTenant _currentTenant; - private readonly ITenantResolveResultAccessor _tenantResolveResultAccessor; public MultiTenancyMiddleware( - ITenantResolver tenantResolver, - ITenantStore tenantStore, - ICurrentTenant currentTenant, - ITenantResolveResultAccessor tenantResolveResultAccessor) + ITenantConfigurationProvider tenantConfigurationProvider, + ICurrentTenant currentTenant) { - _tenantResolver = tenantResolver; - _tenantStore = tenantStore; + _tenantConfigurationProvider = tenantConfigurationProvider; _currentTenant = currentTenant; - _tenantResolveResultAccessor = tenantResolveResultAccessor; } public async Task InvokeAsync(HttpContext context, RequestDelegate next) { - var resolveResult = _tenantResolver.ResolveTenantIdOrName(); - _tenantResolveResultAccessor.Result = resolveResult; - - TenantConfiguration tenant = null; - if (resolveResult.TenantIdOrName != null) - { - tenant = await FindTenantAsync(resolveResult.TenantIdOrName); - - if (tenant == null) - { - throw new BusinessException( - code: "Volo.AbpIo.MultiTenancy:010001", - message: "Tenant not found!", - details: "There is no tenant with the tenant id or name: " + resolveResult.TenantIdOrName - ); - } - } - + var tenant = await _tenantConfigurationProvider.GetAsync(saveResolveResult: true); using (_currentTenant.Change(tenant?.Id, tenant?.Name)) { await next(context); } } - - private async Task FindTenantAsync(string tenantIdOrName) - { - if (Guid.TryParse(tenantIdOrName, out var parsedTenantId)) - { - return await _tenantStore.FindAsync(parsedTenantId); - } - else - { - return await _tenantStore.FindAsync(tenantIdOrName); - } - } } } diff --git a/framework/src/Volo.Abp.MultiTenancy/Volo/Abp/MultiTenancy/ITenantConfigurationProvider.cs b/framework/src/Volo.Abp.MultiTenancy/Volo/Abp/MultiTenancy/ITenantConfigurationProvider.cs new file mode 100644 index 0000000000..010a10791a --- /dev/null +++ b/framework/src/Volo.Abp.MultiTenancy/Volo/Abp/MultiTenancy/ITenantConfigurationProvider.cs @@ -0,0 +1,9 @@ +using System.Threading.Tasks; + +namespace Volo.Abp.MultiTenancy +{ + public interface ITenantConfigurationProvider + { + Task GetAsync(bool saveResolveResult = false); + } +} diff --git a/framework/src/Volo.Abp.MultiTenancy/Volo/Abp/MultiTenancy/TenantConfigurationProvider.cs b/framework/src/Volo.Abp.MultiTenancy/Volo/Abp/MultiTenancy/TenantConfigurationProvider.cs new file mode 100644 index 0000000000..a89c44b465 --- /dev/null +++ b/framework/src/Volo.Abp.MultiTenancy/Volo/Abp/MultiTenancy/TenantConfigurationProvider.cs @@ -0,0 +1,62 @@ +using System; +using System.Threading.Tasks; +using Volo.Abp.DependencyInjection; + +namespace Volo.Abp.MultiTenancy +{ + public class TenantConfigurationProvider : ITenantConfigurationProvider, ITransientDependency + { + protected virtual ITenantResolver TenantResolver { get; } + protected virtual ITenantStore TenantStore { get; } + protected virtual ITenantResolveResultAccessor TenantResolveResultAccessor { get; } + + public TenantConfigurationProvider( + ITenantResolver tenantResolver, + ITenantStore tenantStore, + ITenantResolveResultAccessor tenantResolveResultAccessor) + { + TenantResolver = tenantResolver; + TenantStore = tenantStore; + TenantResolveResultAccessor = tenantResolveResultAccessor; + } + + public virtual async Task GetAsync(bool saveResolveResult = false) + { + var resolveResult = TenantResolver.ResolveTenantIdOrName(); + + if (saveResolveResult) + { + TenantResolveResultAccessor.Result = resolveResult; + } + + TenantConfiguration tenant = null; + if (resolveResult.TenantIdOrName != null) + { + tenant = await FindTenantAsync(resolveResult.TenantIdOrName); + + if (tenant == null) + { + throw new BusinessException( + code: "Volo.AbpIo.MultiTenancy:010001", + message: "Tenant not found!", + details: "There is no tenant with the tenant id or name: " + resolveResult.TenantIdOrName + ); + } + } + + return tenant; + } + + protected virtual async Task FindTenantAsync(string tenantIdOrName) + { + if (Guid.TryParse(tenantIdOrName, out var parsedTenantId)) + { + return await TenantStore.FindAsync(parsedTenantId); + } + else + { + return await TenantStore.FindAsync(tenantIdOrName); + } + } + } +}