Browse Source

#203 Implement caching for settings

pull/652/head
Halil ibrahim Kalkan 7 years ago
parent
commit
0405476eab
  1. 2
      modules/permission-management/src/Volo.Abp.PermissionManagement.Domain/Volo/Abp/PermissionManagement/PermissionGrantCacheItem.cs
  2. 1
      modules/setting-management/src/Volo.Abp.SettingManagement.Domain/Volo.Abp.SettingManagement.Domain.csproj
  3. 12
      modules/setting-management/src/Volo.Abp.SettingManagement.Domain/Volo/Abp/SettingManagement/AbpSettingManagementDomainModule.cs
  4. 1
      modules/setting-management/src/Volo.Abp.SettingManagement.Domain/Volo/Abp/SettingManagement/Setting.cs
  5. 25
      modules/setting-management/src/Volo.Abp.SettingManagement.Domain/Volo/Abp/SettingManagement/SettingCacheItem.cs
  6. 34
      modules/setting-management/src/Volo.Abp.SettingManagement.Domain/Volo/Abp/SettingManagement/SettingCacheItemInvalidator.cs
  7. 61
      modules/setting-management/src/Volo.Abp.SettingManagement.Domain/Volo/Abp/SettingManagement/SettingStore.cs

2
modules/permission-management/src/Volo.Abp.PermissionManagement.Domain/Volo/Abp/PermissionManagement/PermissionGrantCacheItem.cs

@ -5,7 +5,7 @@ namespace Volo.Abp.PermissionManagement
[Serializable] [Serializable]
public class PermissionGrantCacheItem public class PermissionGrantCacheItem
{ {
public string Name { get; set; } public string Name { get; set; } //TODO: Consider to remove this
public bool IsGranted { get; set; } public bool IsGranted { get; set; }

1
modules/setting-management/src/Volo.Abp.SettingManagement.Domain/Volo.Abp.SettingManagement.Domain.csproj

@ -18,6 +18,7 @@
<ProjectReference Include="..\..\..\..\framework\src\Volo.Abp.Ddd.Domain\Volo.Abp.Ddd.Domain.csproj" /> <ProjectReference Include="..\..\..\..\framework\src\Volo.Abp.Ddd.Domain\Volo.Abp.Ddd.Domain.csproj" />
<ProjectReference Include="..\..\..\..\framework\src\Volo.Abp.Settings\Volo.Abp.Settings.csproj" /> <ProjectReference Include="..\..\..\..\framework\src\Volo.Abp.Settings\Volo.Abp.Settings.csproj" />
<ProjectReference Include="..\..\..\..\framework\src\Volo.Abp.Caching\Volo.Abp.Caching.csproj" />
</ItemGroup> </ItemGroup>
</Project> </Project>

12
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.Modularity;
using Volo.Abp.Settings; using Volo.Abp.Settings;
namespace Volo.Abp.SettingManagement namespace Volo.Abp.SettingManagement
{ {
[DependsOn(typeof(AbpSettingsModule))] [DependsOn(
[DependsOn(typeof(AbpDddDomainModule))] typeof(AbpSettingsModule),
[DependsOn(typeof(AbpSettingManagementDomainSharedModule))] typeof(AbpDddDomainModule),
typeof(AbpSettingManagementDomainSharedModule),
typeof(AbpCachingModule)
)]
public class AbpSettingManagementDomainModule : AbpModule public class AbpSettingManagementDomainModule : AbpModule
{ {

1
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 namespace Volo.Abp.SettingManagement
{ {
//TODO: Convert to AggregateRoot
public class Setting : Entity<Guid> public class Setting : Entity<Guid>
{ {
[NotNull] [NotNull]

25
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;
}
}
}

34
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<EntityChangedEventData<Setting>>, ITransientDependency
{
protected IDistributedCache<SettingCacheItem> Cache { get; }
public SettingCacheItemInvalidator(IDistributedCache<SettingCacheItem> cache)
{
Cache = cache;
}
public virtual async Task HandleEventAsync(EntityChangedEventData<Setting> 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);
}
}
}

61
modules/setting-management/src/Volo.Abp.SettingManagement.Domain/Volo/Abp/SettingManagement/SettingStore.cs

@ -1,6 +1,7 @@
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
using System.Threading.Tasks; using System.Threading.Tasks;
using Volo.Abp.Caching;
using Volo.Abp.DependencyInjection; using Volo.Abp.DependencyInjection;
using Volo.Abp.Guids; using Volo.Abp.Guids;
using Volo.Abp.Settings; using Volo.Abp.Settings;
@ -9,49 +10,81 @@ namespace Volo.Abp.SettingManagement
{ {
public class SettingStore : ISettingStore, ITransientDependency public class SettingStore : ISettingStore, ITransientDependency
{ {
private readonly ISettingRepository _settingRepository; protected IDistributedCache<SettingCacheItem> Cache { get; }
private readonly IGuidGenerator _guidGenerator; protected ISettingRepository SettingRepository { get; }
protected IGuidGenerator GuidGenerator { get; }
public SettingStore(ISettingRepository settingRepository, IGuidGenerator guidGenerator) public SettingStore(
ISettingRepository settingRepository,
IGuidGenerator guidGenerator,
IDistributedCache<SettingCacheItem> cache)
{ {
_settingRepository = settingRepository; SettingRepository = settingRepository;
_guidGenerator = guidGenerator; GuidGenerator = guidGenerator;
Cache = cache;
} }
public async Task<string> GetOrNullAsync(string name, string providerName, string providerKey) public async Task<string> GetOrNullAsync(string name, string providerName, string providerKey)
{ {
var setting = await _settingRepository.FindAsync(name, providerName, providerKey); var cacheItem = await GetCacheItemAsync(name, providerName, providerKey);
return setting?.Value; return cacheItem.Value;
} }
public async Task SetAsync(string name, string value, string providerName, string providerKey) 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) if (setting == null)
{ {
setting = new Setting(_guidGenerator.Create(), name, value, providerName, providerKey); setting = new Setting(GuidGenerator.Create(), name, value, providerName, providerKey);
await _settingRepository.InsertAsync(setting); await SettingRepository.InsertAsync(setting);
} }
else else
{ {
setting.Value = value; setting.Value = value;
await _settingRepository.UpdateAsync(setting); await SettingRepository.UpdateAsync(setting);
} }
} }
public async Task<List<SettingValue>> GetListAsync(string providerName, string providerKey) public async Task<List<SettingValue>> 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(); return settings.Select(s => new SettingValue(s.Name, s.Value)).ToList();
} }
public async Task DeleteAsync(string name, string providerName, string providerKey) 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) if (setting != null)
{ {
await _settingRepository.DeleteAsync(setting); await SettingRepository.DeleteAsync(setting);
} }
} }
protected virtual async Task<SettingCacheItem> 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);
}
} }
} }

Loading…
Cancel
Save