diff --git a/modules/cms-kit/src/Volo.CmsKit.Common.Application.Contracts/Volo.CmsKit.Common.Application.Contracts.csproj b/modules/cms-kit/src/Volo.CmsKit.Common.Application.Contracts/Volo.CmsKit.Common.Application.Contracts.csproj index f6957cfe17..7e4476f2f8 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Common.Application.Contracts/Volo.CmsKit.Common.Application.Contracts.csproj +++ b/modules/cms-kit/src/Volo.CmsKit.Common.Application.Contracts/Volo.CmsKit.Common.Application.Contracts.csproj @@ -12,6 +12,7 @@ + diff --git a/modules/cms-kit/src/Volo.CmsKit.Common.Application.Contracts/Volo/CmsKit/CmsKitCommonApplicationContractsModule.cs b/modules/cms-kit/src/Volo.CmsKit.Common.Application.Contracts/Volo/CmsKit/CmsKitCommonApplicationContractsModule.cs index e675de2267..66bbfa8b39 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Common.Application.Contracts/Volo/CmsKit/CmsKitCommonApplicationContractsModule.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Common.Application.Contracts/Volo/CmsKit/CmsKitCommonApplicationContractsModule.cs @@ -1,5 +1,6 @@ using Volo.Abp.Application; using Volo.Abp.Authorization; +using Volo.Abp.Caching; using Volo.Abp.Modularity; namespace Volo.CmsKit; @@ -7,7 +8,8 @@ namespace Volo.CmsKit; [DependsOn( typeof(CmsKitDomainSharedModule), typeof(AbpDddApplicationContractsModule), - typeof(AbpAuthorizationModule) + typeof(AbpAuthorizationModule), + typeof(AbpCachingModule) )] public class CmsKitCommonApplicationContractsModule : AbpModule { diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.Application/Volo/CmsKit/Public/GlobalResources/Handlers/GlobalResourceEventHandler.cs b/modules/cms-kit/src/Volo.CmsKit.Public.Application/Volo/CmsKit/Public/GlobalResources/Handlers/GlobalResourceEventHandler.cs new file mode 100644 index 0000000000..1e9503006c --- /dev/null +++ b/modules/cms-kit/src/Volo.CmsKit.Public.Application/Volo/CmsKit/Public/GlobalResources/Handlers/GlobalResourceEventHandler.cs @@ -0,0 +1,33 @@ +using System.Threading.Tasks; +using Volo.Abp.Caching; +using Volo.Abp.DependencyInjection; +using Volo.Abp.Domain.Entities.Events; +using Volo.Abp.EventBus; +using Volo.Abp.ObjectMapping; +using Volo.CmsKit.GlobalResources; +using Volo.CmsKit.Public.GlobalResources; + +namespace Volo.CmsKit.Public.GlobalResources.Handlers; + +public class GlobalResourceEventHandler: + ILocalEventHandler>, + ITransientDependency +{ + public IObjectMapper ObjectMapper { get; } + private readonly IDistributedCache _resourceCache; + + public GlobalResourceEventHandler( + IDistributedCache resourceCache, + IObjectMapper objectMapper) + { + ObjectMapper = objectMapper; + _resourceCache = resourceCache; + } + + public async Task HandleEventAsync(EntityUpdatedEventData eventData) + { + await _resourceCache.SetAsync( + eventData.Entity.Name, + ObjectMapper.Map(eventData.Entity)); + } +} \ No newline at end of file diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.Web/CmsKitPublicWebModule.cs b/modules/cms-kit/src/Volo.CmsKit.Public.Web/CmsKitPublicWebModule.cs index 2c561f3474..88b01c8ae9 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Public.Web/CmsKitPublicWebModule.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Public.Web/CmsKitPublicWebModule.cs @@ -98,7 +98,7 @@ public class CmsKitPublicWebModule : AbpModule typeof(GlobalStyleViewComponent) ); options.Add( - LayoutHooks.Head.Last, + LayoutHooks.Body.Last, typeof(GlobalScriptViewComponent) ); }); diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.Web/Controllers/CmsKitPublicGlobalResourcesController.cs b/modules/cms-kit/src/Volo.CmsKit.Public.Web/Controllers/CmsKitPublicGlobalResourcesController.cs index 4abe1d48d3..520df2a389 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Public.Web/Controllers/CmsKitPublicGlobalResourcesController.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Public.Web/Controllers/CmsKitPublicGlobalResourcesController.cs @@ -1,7 +1,11 @@ -using System.Text; +using System; +using System.Text; using System.Threading.Tasks; using Microsoft.AspNetCore.Mvc; +using Microsoft.Extensions.Caching.Distributed; using Volo.Abp.AspNetCore.Mvc; +using Volo.Abp.Caching; +using Volo.CmsKit.GlobalResources; using Volo.CmsKit.Public.GlobalResources; namespace Volo.CmsKit.Public.Web.Controllers; @@ -10,31 +14,49 @@ namespace Volo.CmsKit.Public.Web.Controllers; public class CmsKitPublicGlobalResourcesController: AbpController { private readonly IGlobalResourcePublicAppService _globalResourcePublicAppService; + private readonly IDistributedCache _resourceCache; - public CmsKitPublicGlobalResourcesController(IGlobalResourcePublicAppService globalResourcePublicAppService) + public CmsKitPublicGlobalResourcesController( + IGlobalResourcePublicAppService globalResourcePublicAppService, + IDistributedCache resourceCache) { _globalResourcePublicAppService = globalResourcePublicAppService; + _resourceCache = resourceCache; } [HttpGet] [Route("style")] - public async Task GetGlobalStyleAsync(string entityType, string entityId) + public async Task GetGlobalStyleAsync() { - var style = await _globalResourcePublicAppService.GetGlobalStyleAsync(); + var style = await _resourceCache.GetOrAddAsync( + GlobalResourceConsts.GlobalStyleName, //Cache key + async () => await _globalResourcePublicAppService.GetGlobalStyleAsync(), + () => new DistributedCacheEntryOptions + { + AbsoluteExpiration = DateTimeOffset.Now.AddMinutes(2) + } + ); - var contents = Encoding.ASCII.GetBytes(style.Value); - - return new FileContentResult(contents, "text/css"); + return new FileContentResult( + Encoding.ASCII.GetBytes(style.Value), + "text/css"); } [HttpGet] [Route("script")] - public async Task GetGlobalScriptAsync(string entityType, string entityId) + public async Task GetGlobalScriptAsync() { - var script = await _globalResourcePublicAppService.GetGlobalScriptAsync(); - - var contents = Encoding.ASCII.GetBytes(script.Value); + var script = await _resourceCache.GetOrAddAsync( + GlobalResourceConsts.GlobalScriptName, //Cache key + async () => await _globalResourcePublicAppService.GetGlobalScriptAsync(), + () => new DistributedCacheEntryOptions + { + AbsoluteExpiration = DateTimeOffset.Now.AddMinutes(2) + } + ); - return new FileContentResult(contents, "application/javascript"); + return new FileContentResult( + Encoding.ASCII.GetBytes(script.Value), + "application/javascript"); } } \ No newline at end of file