diff --git a/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain/Volo/Abp/PermissionManagement/PermissionGrantCacheItem.cs b/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain/Volo/Abp/PermissionManagement/PermissionGrantCacheItem.cs
index 285bc117bc..e4d3f1648e 100644
--- a/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain/Volo/Abp/PermissionManagement/PermissionGrantCacheItem.cs
+++ b/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain/Volo/Abp/PermissionManagement/PermissionGrantCacheItem.cs
@@ -5,7 +5,7 @@ namespace Volo.Abp.PermissionManagement
[Serializable]
public class PermissionGrantCacheItem
{
- public string Name { get; set; }
+ public string Name { get; set; } //TODO: Consider to remove this
public bool IsGranted { get; set; }
diff --git a/modules/setting-management/src/Volo.Abp.SettingManagement.Domain/Volo.Abp.SettingManagement.Domain.csproj b/modules/setting-management/src/Volo.Abp.SettingManagement.Domain/Volo.Abp.SettingManagement.Domain.csproj
index d0ccb910af..8345be068a 100644
--- a/modules/setting-management/src/Volo.Abp.SettingManagement.Domain/Volo.Abp.SettingManagement.Domain.csproj
+++ b/modules/setting-management/src/Volo.Abp.SettingManagement.Domain/Volo.Abp.SettingManagement.Domain.csproj
@@ -18,6 +18,7 @@
+
diff --git a/modules/setting-management/src/Volo.Abp.SettingManagement.Domain/Volo/Abp/SettingManagement/AbpSettingManagementDomainModule.cs b/modules/setting-management/src/Volo.Abp.SettingManagement.Domain/Volo/Abp/SettingManagement/AbpSettingManagementDomainModule.cs
index 9280008eac..0ddc49b076 100644
--- a/modules/setting-management/src/Volo.Abp.SettingManagement.Domain/Volo/Abp/SettingManagement/AbpSettingManagementDomainModule.cs
+++ b/modules/setting-management/src/Volo.Abp.SettingManagement.Domain/Volo/Abp/SettingManagement/AbpSettingManagementDomainModule.cs
@@ -1,12 +1,16 @@
-using Volo.Abp.Domain;
+using Volo.Abp.Caching;
+using Volo.Abp.Domain;
using Volo.Abp.Modularity;
using Volo.Abp.Settings;
namespace Volo.Abp.SettingManagement
{
- [DependsOn(typeof(AbpSettingsModule))]
- [DependsOn(typeof(AbpDddDomainModule))]
- [DependsOn(typeof(AbpSettingManagementDomainSharedModule))]
+ [DependsOn(
+ typeof(AbpSettingsModule),
+ typeof(AbpDddDomainModule),
+ typeof(AbpSettingManagementDomainSharedModule),
+ typeof(AbpCachingModule)
+ )]
public class AbpSettingManagementDomainModule : AbpModule
{
diff --git a/modules/setting-management/src/Volo.Abp.SettingManagement.Domain/Volo/Abp/SettingManagement/Setting.cs b/modules/setting-management/src/Volo.Abp.SettingManagement.Domain/Volo/Abp/SettingManagement/Setting.cs
index e875004e52..78e7b3e70c 100644
--- a/modules/setting-management/src/Volo.Abp.SettingManagement.Domain/Volo/Abp/SettingManagement/Setting.cs
+++ b/modules/setting-management/src/Volo.Abp.SettingManagement.Domain/Volo/Abp/SettingManagement/Setting.cs
@@ -4,6 +4,7 @@ using Volo.Abp.Domain.Entities;
namespace Volo.Abp.SettingManagement
{
+ //TODO: Convert to AggregateRoot
public class Setting : Entity
{
[NotNull]
diff --git a/modules/setting-management/src/Volo.Abp.SettingManagement.Domain/Volo/Abp/SettingManagement/SettingCacheItem.cs b/modules/setting-management/src/Volo.Abp.SettingManagement.Domain/Volo/Abp/SettingManagement/SettingCacheItem.cs
new file mode 100644
index 0000000000..a590775167
--- /dev/null
+++ b/modules/setting-management/src/Volo.Abp.SettingManagement.Domain/Volo/Abp/SettingManagement/SettingCacheItem.cs
@@ -0,0 +1,25 @@
+using System;
+
+namespace Volo.Abp.SettingManagement
+{
+ [Serializable]
+ public class SettingCacheItem
+ {
+ public string Value { get; set; }
+
+ public SettingCacheItem()
+ {
+
+ }
+
+ public SettingCacheItem(string value)
+ {
+ Value = value;
+ }
+
+ public static string CalculateCacheKey(string name, string providerName, string providerKey)
+ {
+ return "pn:" + providerName + ",pk:" + providerKey + ",n:" + name;
+ }
+ }
+}
diff --git a/modules/setting-management/src/Volo.Abp.SettingManagement.Domain/Volo/Abp/SettingManagement/SettingCacheItemInvalidator.cs b/modules/setting-management/src/Volo.Abp.SettingManagement.Domain/Volo/Abp/SettingManagement/SettingCacheItemInvalidator.cs
new file mode 100644
index 0000000000..35d358a67d
--- /dev/null
+++ b/modules/setting-management/src/Volo.Abp.SettingManagement.Domain/Volo/Abp/SettingManagement/SettingCacheItemInvalidator.cs
@@ -0,0 +1,34 @@
+using System.Threading.Tasks;
+using Volo.Abp.Caching;
+using Volo.Abp.DependencyInjection;
+using Volo.Abp.Domain.Entities.Events;
+using Volo.Abp.EventBus;
+
+namespace Volo.Abp.SettingManagement
+{
+ public class SettingCacheItemInvalidator : ILocalEventHandler>, ITransientDependency
+ {
+ protected IDistributedCache Cache { get; }
+
+ public SettingCacheItemInvalidator(IDistributedCache cache)
+ {
+ Cache = cache;
+ }
+
+ public virtual async Task HandleEventAsync(EntityChangedEventData eventData)
+ {
+ var cacheKey = CalculateCacheKey(
+ eventData.Entity.Name,
+ eventData.Entity.ProviderName,
+ eventData.Entity.ProviderKey
+ );
+
+ await Cache.RemoveAsync(cacheKey);
+ }
+
+ protected virtual string CalculateCacheKey(string name, string providerName, string providerKey)
+ {
+ return SettingCacheItem.CalculateCacheKey(name, providerName, providerKey);
+ }
+ }
+}
diff --git a/modules/setting-management/src/Volo.Abp.SettingManagement.Domain/Volo/Abp/SettingManagement/SettingStore.cs b/modules/setting-management/src/Volo.Abp.SettingManagement.Domain/Volo/Abp/SettingManagement/SettingStore.cs
index 0be50a921c..f95887658d 100644
--- a/modules/setting-management/src/Volo.Abp.SettingManagement.Domain/Volo/Abp/SettingManagement/SettingStore.cs
+++ b/modules/setting-management/src/Volo.Abp.SettingManagement.Domain/Volo/Abp/SettingManagement/SettingStore.cs
@@ -1,6 +1,7 @@
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
+using Volo.Abp.Caching;
using Volo.Abp.DependencyInjection;
using Volo.Abp.Guids;
using Volo.Abp.Settings;
@@ -9,49 +10,81 @@ namespace Volo.Abp.SettingManagement
{
public class SettingStore : ISettingStore, ITransientDependency
{
- private readonly ISettingRepository _settingRepository;
- private readonly IGuidGenerator _guidGenerator;
+ protected IDistributedCache Cache { get; }
+ protected ISettingRepository SettingRepository { get; }
+ protected IGuidGenerator GuidGenerator { get; }
- public SettingStore(ISettingRepository settingRepository, IGuidGenerator guidGenerator)
+ public SettingStore(
+ ISettingRepository settingRepository,
+ IGuidGenerator guidGenerator,
+ IDistributedCache cache)
{
- _settingRepository = settingRepository;
- _guidGenerator = guidGenerator;
+ SettingRepository = settingRepository;
+ GuidGenerator = guidGenerator;
+ Cache = cache;
}
public async Task GetOrNullAsync(string name, string providerName, string providerKey)
{
- var setting = await _settingRepository.FindAsync(name, providerName, providerKey);
- return setting?.Value;
+ var cacheItem = await GetCacheItemAsync(name, providerName, providerKey);
+ return cacheItem.Value;
}
public async Task SetAsync(string name, string value, string providerName, string providerKey)
{
- var setting = await _settingRepository.FindAsync(name, providerName, providerKey);
+ var setting = await SettingRepository.FindAsync(name, providerName, providerKey);
if (setting == null)
{
- setting = new Setting(_guidGenerator.Create(), name, value, providerName, providerKey);
- await _settingRepository.InsertAsync(setting);
+ setting = new Setting(GuidGenerator.Create(), name, value, providerName, providerKey);
+ await SettingRepository.InsertAsync(setting);
}
else
{
setting.Value = value;
- await _settingRepository.UpdateAsync(setting);
+ await SettingRepository.UpdateAsync(setting);
}
}
public async Task> GetListAsync(string providerName, string providerKey)
{
- var settings = await _settingRepository.GetListAsync(providerName, providerKey);
+ var settings = await SettingRepository.GetListAsync(providerName, providerKey);
return settings.Select(s => new SettingValue(s.Name, s.Value)).ToList();
}
public async Task DeleteAsync(string name, string providerName, string providerKey)
{
- var setting = await _settingRepository.FindAsync(name, providerName, providerKey);
+ var setting = await SettingRepository.FindAsync(name, providerName, providerKey);
if (setting != null)
{
- await _settingRepository.DeleteAsync(setting);
+ await SettingRepository.DeleteAsync(setting);
}
}
+
+ protected virtual async Task GetCacheItemAsync(string name, string providerName, string providerKey)
+ {
+ var cacheKey = CalculateCacheKey(name, providerName, providerKey);
+ var cacheItem = await Cache.GetAsync(cacheKey);
+
+ if (cacheItem != null)
+ {
+ return cacheItem;
+ }
+
+ var setting = await SettingRepository.FindAsync(name, providerName, providerKey);
+
+ cacheItem = new SettingCacheItem(setting?.Value);
+
+ await Cache.SetAsync(
+ cacheKey,
+ cacheItem
+ );
+
+ return cacheItem;
+ }
+
+ protected virtual string CalculateCacheKey(string name, string providerName, string providerKey)
+ {
+ return SettingCacheItem.CalculateCacheKey(name, providerName, providerKey);
+ }
}
}