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-*"); } }