using Infrastructure.Application.Entites.Settings; using Infrastructure.Data; using Infrastructure.Extensions; using Microsoft.Extensions.Caching.Distributed; using Microsoft.Extensions.DependencyInjection; using System; using System.Globalization; using System.Linq; namespace Infrastructure.Application.Services.Settings { public class CachedSettingService : ISettingService { private readonly IServiceProvider _sp; private readonly string _keyTemplate = "iot-setting-{0}"; public CachedSettingService(IServiceProvider sp) { this._sp = sp; } public Setting GetSetting(string name) { var key = string.Format(CultureInfo.InvariantCulture, _keyTemplate, name); using var scope = this._sp.CreateScope(); var cache = scope.ServiceProvider.GetRequiredService(); var setting = cache.Get(key); if (setting == null) { var repo = scope.ServiceProvider.GetRequiredService>(); setting = repo.ReadOnlyTable().FirstOrDefault(o => o.Name == name); cache.Set(key, setting); } return setting; } public void AddSetting(Setting setting) { using var scope = this._sp.CreateScope(); var repo = scope.ServiceProvider.GetRequiredService>(); repo.Add(setting); repo.SaveChanges(); } public void DeleteSetting(Setting setting) { if (setting is null) { throw new ArgumentNullException(nameof(setting)); } var key = string.Format(CultureInfo.InvariantCulture, _keyTemplate, setting.Name); using var scope = this._sp.CreateScope(); var repo = scope.ServiceProvider.GetRequiredService>(); var entity = repo.Table().FirstOrDefault(o => o.Id == setting.Id); repo.Delete(entity); repo.SaveChanges(); var cache = scope.ServiceProvider.GetRequiredService(); cache.Remove(key); } public void UpdateSetting(Setting setting) { if (setting is null) { throw new ArgumentNullException(nameof(setting)); } var key = string.Format(CultureInfo.InvariantCulture, _keyTemplate, setting.Name); using var scope = this._sp.CreateScope(); var repo = scope.ServiceProvider.GetRequiredService>(); var entity = repo.Table().FirstOrDefault(o => o.Id == setting.Id); entity.From(setting); repo.SaveChanges(); var cache = scope.ServiceProvider.GetRequiredService(); cache.Remove(key); } public string GetValue(string name) { return this.GetSetting(name)?.Value; } } }