diff --git a/aspnet-core/modules/tenants/LINGYUN.Abp.MultiTenancy.Saas/LINGYUN.Abp.MultiTenancy.Saas.csproj b/aspnet-core/modules/tenants/LINGYUN.Abp.MultiTenancy.Saas/LINGYUN.Abp.MultiTenancy.Saas.csproj index 86d224b84..ff3d84fc8 100644 --- a/aspnet-core/modules/tenants/LINGYUN.Abp.MultiTenancy.Saas/LINGYUN.Abp.MultiTenancy.Saas.csproj +++ b/aspnet-core/modules/tenants/LINGYUN.Abp.MultiTenancy.Saas/LINGYUN.Abp.MultiTenancy.Saas.csproj @@ -16,6 +16,7 @@ + diff --git a/aspnet-core/modules/tenants/LINGYUN.Abp.MultiTenancy.Saas/LINGYUN/Abp/MultiTenancy/Saas/EditionCacheItem.cs b/aspnet-core/modules/tenants/LINGYUN.Abp.MultiTenancy.Saas/LINGYUN/Abp/MultiTenancy/Saas/EditionCacheItem.cs new file mode 100644 index 000000000..5189a2065 --- /dev/null +++ b/aspnet-core/modules/tenants/LINGYUN.Abp.MultiTenancy.Saas/LINGYUN/Abp/MultiTenancy/Saas/EditionCacheItem.cs @@ -0,0 +1,29 @@ +using LINGYUN.Abp.MultiTenancy.Editions; +using System; +using Volo.Abp.MultiTenancy; + +namespace LINGYUN.Abp.MultiTenancy.Saas; + +[Serializable] +[IgnoreMultiTenancy] +public class EditionCacheItem +{ + private const string CacheKeyFormat = "t:{0}"; + + public EditionInfo Value { get; set; } + + public EditionCacheItem() + { + + } + + public EditionCacheItem(EditionInfo value) + { + Value = value; + } + + public static string CalculateCacheKey(Guid tenantId) + { + return string.Format(CacheKeyFormat, tenantId.ToString()); + } +} diff --git a/aspnet-core/modules/tenants/LINGYUN.Abp.MultiTenancy.Saas/LINGYUN/Abp/MultiTenancy/Saas/EditionStore.cs b/aspnet-core/modules/tenants/LINGYUN.Abp.MultiTenancy.Saas/LINGYUN/Abp/MultiTenancy/Saas/EditionStore.cs new file mode 100644 index 000000000..698824070 --- /dev/null +++ b/aspnet-core/modules/tenants/LINGYUN.Abp.MultiTenancy.Saas/LINGYUN/Abp/MultiTenancy/Saas/EditionStore.cs @@ -0,0 +1,66 @@ +using JetBrains.Annotations; +using LINGYUN.Abp.MultiTenancy.Editions; +using LINGYUN.Abp.Saas.Tenants; +using System; +using System.Threading.Tasks; +using Volo.Abp.Caching; +using Volo.Abp.DependencyInjection; +using Volo.Abp.MultiTenancy; + +namespace LINGYUN.Abp.MultiTenancy.Saas; + +public class EditionStore : IEditionStore, ITransientDependency +{ + protected ITenantAppService TenantAppService { get; } + protected ICurrentTenant CurrentTenant { get; } + protected IDistributedCache Cache { get; } + + public EditionStore( + ITenantAppService tenantAppService, + ICurrentTenant currentTenant, + IDistributedCache cache) + { + TenantAppService = tenantAppService; + CurrentTenant = currentTenant; + Cache = cache; + } + + public async virtual Task FindByTenantAsync(Guid tenantId) + { + return (await GetCacheItemAsync(tenantId)).Value; + } + + protected async virtual Task GetCacheItemAsync(Guid tenantId) + { + var cacheKey = CalculateCacheKey(tenantId); + + var cacheItem = await Cache.GetAsync(cacheKey, considerUow: true); + if (cacheItem != null) + { + return cacheItem; + } + + using (CurrentTenant.Change(null)) + { + var tenant = await TenantAppService.GetAsync(tenantId); + return await SetCacheAsync(cacheKey, tenant); + } + } + + protected async virtual Task SetCacheAsync(string cacheKey, [CanBeNull] TenantDto tenant) + { + EditionInfo editionInfo = null; + if (tenant != null && tenant.EditionId.HasValue && !tenant.EditionName.IsNullOrWhiteSpace()) + { + editionInfo = new EditionInfo(tenant.EditionId.Value, tenant.EditionName); + } + var cacheItem = new EditionCacheItem(editionInfo); + await Cache.SetAsync(cacheKey, cacheItem, considerUow: true); + return cacheItem; + } + + protected virtual string CalculateCacheKey(Guid tenantId) + { + return EditionCacheItem.CalculateCacheKey(tenantId); + } +} diff --git a/aspnet-core/modules/tenants/LINGYUN.Abp.MultiTenancy.Saas/LINGYUN/Abp/MultiTenancy/Saas/TenantCacheItemInvalidator.cs b/aspnet-core/modules/tenants/LINGYUN.Abp.MultiTenancy.Saas/LINGYUN/Abp/MultiTenancy/Saas/TenantCacheItemInvalidator.cs index 7adabd46b..01efd49ae 100644 --- a/aspnet-core/modules/tenants/LINGYUN.Abp.MultiTenancy.Saas/LINGYUN/Abp/MultiTenancy/Saas/TenantCacheItemInvalidator.cs +++ b/aspnet-core/modules/tenants/LINGYUN.Abp.MultiTenancy.Saas/LINGYUN/Abp/MultiTenancy/Saas/TenantCacheItemInvalidator.cs @@ -28,6 +28,11 @@ public class TenantCacheItemInvalidator : eventData.Entity.Id, eventData.Entity.Name), considerUow: true); + + await Cache.RemoveAsync( + EditionCacheItem.CalculateCacheKey( + eventData.Entity.Id), + considerUow: true); } public virtual async Task HandleEventAsync(EntityDeletedEto eventData) @@ -37,6 +42,11 @@ public class TenantCacheItemInvalidator : eventData.Entity.Id, eventData.Entity.Name), considerUow: true); + + await Cache.RemoveAsync( + EditionCacheItem.CalculateCacheKey( + eventData.Entity.Id), + considerUow: true); } public virtual async Task HandleEventAsync(ConnectionStringCreatedEventData eventData)