From 9bd3076abfa210625f804b58184dee72f8600956 Mon Sep 17 00:00:00 2001 From: Andy Butland Date: Tue, 8 Jul 2025 15:53:37 +0200 Subject: [PATCH] Register no-op implementation of IMemberPartialViewCacheInvalidator in headless setups (#19666) * Register no-op implementation of IMemberPartialViewCacheInvalidator in headless setups. * Tidied usings. # Conflicts: # src/Umbraco.Core/DependencyInjection/UmbracoBuilder.cs --- .../NoopMemberPartialViewCacheInvalidator.cs | 9 +++++++++ src/Umbraco.Core/DependencyInjection/UmbracoBuilder.cs | 8 +++++++- .../MemberPartialViewCacheInvalidator.cs | 2 +- 3 files changed, 17 insertions(+), 2 deletions(-) create mode 100644 src/Umbraco.Core/Cache/PartialViewCacheInvalidators/NoopMemberPartialViewCacheInvalidator.cs diff --git a/src/Umbraco.Core/Cache/PartialViewCacheInvalidators/NoopMemberPartialViewCacheInvalidator.cs b/src/Umbraco.Core/Cache/PartialViewCacheInvalidators/NoopMemberPartialViewCacheInvalidator.cs new file mode 100644 index 0000000000..3fd366f2c7 --- /dev/null +++ b/src/Umbraco.Core/Cache/PartialViewCacheInvalidators/NoopMemberPartialViewCacheInvalidator.cs @@ -0,0 +1,9 @@ +namespace Umbraco.Cms.Core.Cache.PartialViewCacheInvalidators; + +internal class NoopMemberPartialViewCacheInvalidator : IMemberPartialViewCacheInvalidator +{ + public void ClearPartialViewCacheItems(IEnumerable memberIds) + { + // No operation performed, this is a no-op implementation. + } +} diff --git a/src/Umbraco.Core/DependencyInjection/UmbracoBuilder.cs b/src/Umbraco.Core/DependencyInjection/UmbracoBuilder.cs index 77d814579c..c6802ed29e 100644 --- a/src/Umbraco.Core/DependencyInjection/UmbracoBuilder.cs +++ b/src/Umbraco.Core/DependencyInjection/UmbracoBuilder.cs @@ -8,11 +8,13 @@ using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging.Abstractions; using Microsoft.Extensions.Options; using Umbraco.Cms.Core.Cache; +using Umbraco.Cms.Core.Cache.PartialViewCacheInvalidators; using Umbraco.Cms.Core.Composing; using Umbraco.Cms.Core.Configuration; using Umbraco.Cms.Core.Configuration.Models; using Umbraco.Cms.Core.Diagnostics; using Umbraco.Cms.Core.Dictionary; +using Umbraco.Cms.Core.DynamicRoot; using Umbraco.Cms.Core.Editors; using Umbraco.Cms.Core.Events; using Umbraco.Cms.Core.Features; @@ -32,7 +34,6 @@ using Umbraco.Cms.Core.Scoping; using Umbraco.Cms.Core.Security; using Umbraco.Cms.Core.Services; using Umbraco.Cms.Core.Services.ContentTypeEditing; -using Umbraco.Cms.Core.DynamicRoot; using Umbraco.Cms.Core.Preview; using Umbraco.Cms.Core.PublishedCache; using Umbraco.Cms.Core.PublishedCache.Internal; @@ -389,6 +390,11 @@ namespace Umbraco.Cms.Core.DependencyInjection Services.AddUnique(); Services.AddNotificationHandler(); + // Partial view cache invalidators (no-op, shipped implementation is added in Umbraco.Web.Website, but we + // need this to ensure we have a service registered for this interface even in headless setups). + // See: https://github.com/umbraco/Umbraco-CMS/issues/19661 + Services.AddUnique(); + // Two factor providers Services.AddUnique(); Services.AddUnique(); diff --git a/src/Umbraco.Web.Website/Cache/PartialViewCacheInvalidators/MemberPartialViewCacheInvalidator.cs b/src/Umbraco.Web.Website/Cache/PartialViewCacheInvalidators/MemberPartialViewCacheInvalidator.cs index 8ee4be4c00..96adf580b6 100644 --- a/src/Umbraco.Web.Website/Cache/PartialViewCacheInvalidators/MemberPartialViewCacheInvalidator.cs +++ b/src/Umbraco.Web.Website/Cache/PartialViewCacheInvalidators/MemberPartialViewCacheInvalidator.cs @@ -32,7 +32,7 @@ public class MemberPartialViewCacheInvalidator : IMemberPartialViewCacheInvalida _appCaches.RuntimeCache.ClearByRegex($"{CoreCacheHelperExtensions.PartialViewCacheKey}.*-m{memberId}-*"); } - // since it is possible to add a cache item linked to members without a member logged in, we should always clear these items. + // Since it is possible to add a cache item linked to members without a member logged in, we should always clear these items. _appCaches.RuntimeCache.ClearByRegex($"{CoreCacheHelperExtensions.PartialViewCacheKey}.*-m-*"); } }