From 739bc61f0364794359f3de1d823a58c61c7f85d4 Mon Sep 17 00:00:00 2001
From: cKey <35512826+colinin@users.noreply.github.com>
Date: Thu, 17 Mar 2022 18:21:59 +0800
Subject: [PATCH] feat(saas): Implement EditionStore interface based on remote
service.
---
.../LINGYUN.Abp.MultiTenancy.Saas.csproj | 1 +
.../Abp/MultiTenancy/Saas/EditionCacheItem.cs | 29 ++++++++
.../Abp/MultiTenancy/Saas/EditionStore.cs | 66 +++++++++++++++++++
.../Saas/TenantCacheItemInvalidator.cs | 10 +++
4 files changed, 106 insertions(+)
create mode 100644 aspnet-core/modules/tenants/LINGYUN.Abp.MultiTenancy.Saas/LINGYUN/Abp/MultiTenancy/Saas/EditionCacheItem.cs
create mode 100644 aspnet-core/modules/tenants/LINGYUN.Abp.MultiTenancy.Saas/LINGYUN/Abp/MultiTenancy/Saas/EditionStore.cs
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)