From 0405476eabb45b16259c5af052d1d8bfe12805a9 Mon Sep 17 00:00:00 2001 From: Halil ibrahim Kalkan Date: Wed, 12 Dec 2018 17:01:12 +0300 Subject: [PATCH] #203 Implement caching for settings --- .../PermissionGrantCacheItem.cs | 2 +- .../Volo.Abp.SettingManagement.Domain.csproj | 1 + .../AbpSettingManagementDomainModule.cs | 12 ++-- .../Volo/Abp/SettingManagement/Setting.cs | 1 + .../Abp/SettingManagement/SettingCacheItem.cs | 25 ++++++++ .../SettingCacheItemInvalidator.cs | 34 +++++++++++ .../Abp/SettingManagement/SettingStore.cs | 61 ++++++++++++++----- 7 files changed, 117 insertions(+), 19 deletions(-) create mode 100644 modules/setting-management/src/Volo.Abp.SettingManagement.Domain/Volo/Abp/SettingManagement/SettingCacheItem.cs create mode 100644 modules/setting-management/src/Volo.Abp.SettingManagement.Domain/Volo/Abp/SettingManagement/SettingCacheItemInvalidator.cs 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); + } } }