From 06a202e30eeb646ea91aab5bcf1c1de2b52781aa Mon Sep 17 00:00:00 2001 From: Bjarke Berg Date: Fri, 12 Mar 2021 21:48:24 +0100 Subject: [PATCH 1/8] Migrated CacheRefresher events to IEventAggregator pattern. --- .../Cache/ApplicationCacheRefresher.cs | 9 +- src/Umbraco.Core/Cache/CacheRefresherBase.cs | 34 ++--- .../Cache/CacheRefresherEventArgs.cs | 19 --- .../Cache/CacheRefresherNotificationBase.cs | 83 ++++++++++ .../Cache/ContentCacheRefresher.cs | 15 +- .../Cache/ContentTypeCacheRefresher.cs | 16 +- .../Cache/DataTypeCacheRefresher.cs | 15 +- .../Cache/DictionaryCacheRefresher.cs | 9 +- .../Cache/DomainCacheRefresher.cs | 13 +- .../Cache/JsonCacheRefresherBase.cs | 15 +- .../Cache/LanguageCacheRefresher.cs | 13 +- src/Umbraco.Core/Cache/MacroCacheRefresher.cs | 12 +- src/Umbraco.Core/Cache/MediaCacheRefresher.cs | 9 +- .../Cache/MemberCacheRefresher.cs | 9 +- .../Cache/MemberGroupCacheRefresher.cs | 9 +- .../Cache/PayloadCacheRefresherBase.cs | 13 +- .../Cache/PublicAccessCacheRefresher.cs | 9 +- .../Cache/RelationTypeCacheRefresher.cs | 9 +- .../Cache/TemplateCacheRefresher.cs | 9 +- src/Umbraco.Core/Cache/UserCacheRefresher.cs | 11 +- .../Cache/UserGroupCacheRefresher.cs | 9 +- src/Umbraco.Core/Umbraco.Core.csproj | 4 + .../UmbracoBuilder.Examine.cs} | 23 ++- .../ModelsBuilder/LiveModelsProvider.cs | 26 ++-- .../ModelsBuilder/OutOfDateModelsStatus.cs | 29 ++-- ...onent.cs => ExamineNotificationHandler.cs} | 142 ++++++++++-------- .../Testing/UmbracoIntegrationTest.cs | 2 +- .../Services/ContentEventsTests.cs | 69 +++++---- .../UmbracoBuilderExtensions.cs | 7 +- .../SignalR/PreviewHubComposer.cs | 13 -- ...ewHubComponent.cs => PreviewHubUpdater.cs} | 24 +-- ...acoBuilderDependencyInjectionExtensions.cs | 8 +- 32 files changed, 390 insertions(+), 297 deletions(-) delete mode 100644 src/Umbraco.Core/Cache/CacheRefresherEventArgs.cs create mode 100644 src/Umbraco.Core/Cache/CacheRefresherNotificationBase.cs rename src/Umbraco.Infrastructure/{Search/ExamineComposer.cs => DependencyInjection/UmbracoBuilder.Examine.cs} (69%) rename src/Umbraco.Infrastructure/Search/{ExamineComponent.cs => ExamineNotificationHandler.cs} (86%) delete mode 100644 src/Umbraco.Web.BackOffice/SignalR/PreviewHubComposer.cs rename src/Umbraco.Web.BackOffice/SignalR/{PreviewHubComponent.cs => PreviewHubUpdater.cs} (54%) diff --git a/src/Umbraco.Core/Cache/ApplicationCacheRefresher.cs b/src/Umbraco.Core/Cache/ApplicationCacheRefresher.cs index 360fd44ba8..b8dccd1f59 100644 --- a/src/Umbraco.Core/Cache/ApplicationCacheRefresher.cs +++ b/src/Umbraco.Core/Cache/ApplicationCacheRefresher.cs @@ -1,17 +1,16 @@ using System; +using Umbraco.Cms.Core.Events; namespace Umbraco.Cms.Core.Cache { - public sealed class ApplicationCacheRefresher : CacheRefresherBase + public sealed class ApplicationCacheRefresher : CacheRefresherBase { - public ApplicationCacheRefresher(AppCaches appCaches) - : base(appCaches) + public ApplicationCacheRefresher(AppCaches appCaches, IEventAggregator eventAggregator) + : base(appCaches, eventAggregator) { } #region Define - protected override ApplicationCacheRefresher This => this; - public static readonly Guid UniqueId = Guid.Parse("B15F34A1-BC1D-4F8B-8369-3222728AB4C8"); public override Guid RefresherUniqueId => UniqueId; diff --git a/src/Umbraco.Core/Cache/CacheRefresherBase.cs b/src/Umbraco.Core/Cache/CacheRefresherBase.cs index d3a09dbf8f..be4129f928 100644 --- a/src/Umbraco.Core/Cache/CacheRefresherBase.cs +++ b/src/Umbraco.Core/Cache/CacheRefresherBase.cs @@ -10,33 +10,21 @@ namespace Umbraco.Cms.Core.Cache /// /// The actual cache refresher type. /// The actual cache refresher type is used for strongly typed events. - public abstract class CacheRefresherBase : ICacheRefresher - where TInstanceType : class, ICacheRefresher + public abstract class CacheRefresherBase< TNotification> : ICacheRefresher + where TNotification : CacheRefresherNotificationBase, new() { /// /// Initializes a new instance of the . /// /// A cache helper. - protected CacheRefresherBase(AppCaches appCaches) + protected CacheRefresherBase(AppCaches appCaches, IEventAggregator eventAggregator) { AppCaches = appCaches; + EventAggregator = eventAggregator; } - /// - /// Triggers when the cache is updated on the server. - /// - /// - /// Triggers on each server configured for an Umbraco project whenever a cache refresher is updated. - /// - public static event TypedEventHandler CacheUpdated; - #region Define - /// - /// Gets the typed 'this' for events. - /// - protected abstract TInstanceType This { get; } - /// /// Gets the unique identifier of the refresher. /// @@ -56,7 +44,7 @@ namespace Umbraco.Cms.Core.Cache /// public virtual void RefreshAll() { - OnCacheUpdated(This, new CacheRefresherEventArgs(null, MessageType.RefreshAll)); + OnCacheUpdated(new TNotification().Init(null, MessageType.RefreshAll)); } /// @@ -65,7 +53,7 @@ namespace Umbraco.Cms.Core.Cache /// The entity's identifier. public virtual void Refresh(int id) { - OnCacheUpdated(This, new CacheRefresherEventArgs(id, MessageType.RefreshById)); + OnCacheUpdated(new TNotification().Init(id, MessageType.RefreshById)); } /// @@ -74,7 +62,7 @@ namespace Umbraco.Cms.Core.Cache /// The entity's identifier. public virtual void Refresh(Guid id) { - OnCacheUpdated(This, new CacheRefresherEventArgs(id, MessageType.RefreshById)); + OnCacheUpdated(new TNotification().Init(id, MessageType.RefreshById)); } /// @@ -83,7 +71,7 @@ namespace Umbraco.Cms.Core.Cache /// The entity's identifier. public virtual void Remove(int id) { - OnCacheUpdated(This, new CacheRefresherEventArgs(id, MessageType.RemoveById)); + OnCacheUpdated(new TNotification().Init(id, MessageType.RemoveById)); } #endregion @@ -95,6 +83,8 @@ namespace Umbraco.Cms.Core.Cache /// protected AppCaches AppCaches { get; } + protected IEventAggregator EventAggregator { get; } + /// /// Clears the cache for all repository entities of a specified type. /// @@ -110,9 +100,9 @@ namespace Umbraco.Cms.Core.Cache /// /// The event sender. /// The event arguments. - protected static void OnCacheUpdated(TInstanceType sender, CacheRefresherEventArgs args) + protected void OnCacheUpdated(CacheRefresherNotificationBase notification) { - CacheUpdated?.Invoke(sender, args); + EventAggregator.Publish(notification); } #endregion diff --git a/src/Umbraco.Core/Cache/CacheRefresherEventArgs.cs b/src/Umbraco.Core/Cache/CacheRefresherEventArgs.cs deleted file mode 100644 index e1d04a7095..0000000000 --- a/src/Umbraco.Core/Cache/CacheRefresherEventArgs.cs +++ /dev/null @@ -1,19 +0,0 @@ -using System; -using Umbraco.Cms.Core.Sync; - -namespace Umbraco.Cms.Core.Cache -{ - /// - /// Event args for cache refresher updates - /// - public class CacheRefresherEventArgs : EventArgs - { - public CacheRefresherEventArgs(object msgObject, MessageType type) - { - MessageType = type; - MessageObject = msgObject; - } - public object MessageObject { get; private set; } - public MessageType MessageType { get; private set; } - } -} diff --git a/src/Umbraco.Core/Cache/CacheRefresherNotificationBase.cs b/src/Umbraco.Core/Cache/CacheRefresherNotificationBase.cs new file mode 100644 index 0000000000..7818678cfe --- /dev/null +++ b/src/Umbraco.Core/Cache/CacheRefresherNotificationBase.cs @@ -0,0 +1,83 @@ +using Umbraco.Cms.Core.Events; +using Umbraco.Cms.Core.Sync; + +namespace Umbraco.Cms.Core.Cache +{ + /// + /// Event args for cache refresher updates + /// + public abstract class CacheRefresherNotificationBase : INotification + { + public CacheRefresherNotificationBase Init(object msgObject, MessageType type) + { + MessageType = type; + MessageObject = msgObject; + + return this; + } + public object MessageObject { get; private set; } + public MessageType MessageType { get; private set;} + } + public class DataTypeCacheRefresherNotification : CacheRefresherNotificationBase + { + } + + public class UserCacheRefresherNotification : CacheRefresherNotificationBase + { + } + + + public class ContentCacheRefresherNotification : CacheRefresherNotificationBase + { + } + + public class TemplateCacheRefresherNotification : CacheRefresherNotificationBase + { + } + + public class RelationTypeCacheRefresherNotification : CacheRefresherNotificationBase + { + } + + public class PublicAccessCacheRefresherNotification : CacheRefresherNotificationBase + { + } + + public class MemberGroupCacheRefresherNotification : CacheRefresherNotificationBase + { + } + + public class MemberCacheRefresherNotification : CacheRefresherNotificationBase + { + } + + public class MediaCacheRefresherNotification : CacheRefresherNotificationBase + { + } + + public class UserGroupCacheRefresherNotification : CacheRefresherNotificationBase + { + } + + public class LanguageCacheRefresherNotification : CacheRefresherNotificationBase + { + } + public class MacroCacheRefresherNotification : CacheRefresherNotificationBase + { + } + + public class DomainCacheRefresherNotification : CacheRefresherNotificationBase + { + } + + public class ContentTypeCacheRefresherNotification : CacheRefresherNotificationBase + { + } + + public class ApplicationCacheRefresherNotification : CacheRefresherNotificationBase + { + } + public class DictionaryCacheRefresherNotification : CacheRefresherNotificationBase + { + } +} diff --git a/src/Umbraco.Core/Cache/ContentCacheRefresher.cs b/src/Umbraco.Core/Cache/ContentCacheRefresher.cs index e77fa7abef..42674d689b 100644 --- a/src/Umbraco.Core/Cache/ContentCacheRefresher.cs +++ b/src/Umbraco.Core/Cache/ContentCacheRefresher.cs @@ -1,6 +1,7 @@ using System; using System.Collections.Generic; using System.Linq; +using Umbraco.Cms.Core.Events; using Umbraco.Cms.Core.Models; using Umbraco.Cms.Core.Persistence.Repositories; using Umbraco.Cms.Core.PublishedCache; @@ -11,14 +12,20 @@ using Umbraco.Extensions; namespace Umbraco.Cms.Core.Cache { - public sealed class ContentCacheRefresher : PayloadCacheRefresherBase + public sealed class ContentCacheRefresher : PayloadCacheRefresherBase { private readonly IPublishedSnapshotService _publishedSnapshotService; private readonly IIdKeyMap _idKeyMap; private readonly IDomainService _domainService; - public ContentCacheRefresher(AppCaches appCaches, IJsonSerializer serializer, IPublishedSnapshotService publishedSnapshotService, IIdKeyMap idKeyMap, IDomainService domainService) - : base(appCaches, serializer) + public ContentCacheRefresher( + AppCaches appCaches, + IJsonSerializer serializer, + IPublishedSnapshotService publishedSnapshotService, + IIdKeyMap idKeyMap, + IDomainService domainService, + IEventAggregator eventAggregator) + : base(appCaches, serializer, eventAggregator) { _publishedSnapshotService = publishedSnapshotService; _idKeyMap = idKeyMap; @@ -27,8 +34,6 @@ namespace Umbraco.Cms.Core.Cache #region Define - protected override ContentCacheRefresher This => this; - public static readonly Guid UniqueId = Guid.Parse("900A4FBE-DF3C-41E6-BB77-BE896CD158EA"); public override Guid RefresherUniqueId => UniqueId; diff --git a/src/Umbraco.Core/Cache/ContentTypeCacheRefresher.cs b/src/Umbraco.Core/Cache/ContentTypeCacheRefresher.cs index 8a1ba1234e..00838865ce 100644 --- a/src/Umbraco.Core/Cache/ContentTypeCacheRefresher.cs +++ b/src/Umbraco.Core/Cache/ContentTypeCacheRefresher.cs @@ -1,5 +1,6 @@ using System; using System.Linq; +using Umbraco.Cms.Core.Events; using Umbraco.Cms.Core.Models; using Umbraco.Cms.Core.Models.PublishedContent; using Umbraco.Cms.Core.Persistence.Repositories; @@ -11,15 +12,22 @@ using Umbraco.Extensions; namespace Umbraco.Cms.Core.Cache { - public sealed class ContentTypeCacheRefresher : PayloadCacheRefresherBase + public sealed class ContentTypeCacheRefresher : PayloadCacheRefresherBase { private readonly IPublishedSnapshotService _publishedSnapshotService; private readonly IPublishedModelFactory _publishedModelFactory; private readonly IContentTypeCommonRepository _contentTypeCommonRepository; private readonly IIdKeyMap _idKeyMap; - public ContentTypeCacheRefresher(AppCaches appCaches, IJsonSerializer serializer, IPublishedSnapshotService publishedSnapshotService, IPublishedModelFactory publishedModelFactory, IIdKeyMap idKeyMap, IContentTypeCommonRepository contentTypeCommonRepository) - : base(appCaches, serializer) + public ContentTypeCacheRefresher( + AppCaches appCaches, + IJsonSerializer serializer, + IPublishedSnapshotService publishedSnapshotService, + IPublishedModelFactory publishedModelFactory, + IIdKeyMap idKeyMap, + IContentTypeCommonRepository contentTypeCommonRepository, + IEventAggregator eventAggregator) + : base(appCaches, serializer, eventAggregator) { _publishedSnapshotService = publishedSnapshotService; _publishedModelFactory = publishedModelFactory; @@ -29,8 +37,6 @@ namespace Umbraco.Cms.Core.Cache #region Define - protected override ContentTypeCacheRefresher This => this; - public static readonly Guid UniqueId = Guid.Parse("6902E22C-9C10-483C-91F3-66B7CAE9E2F5"); public override Guid RefresherUniqueId => UniqueId; diff --git a/src/Umbraco.Core/Cache/DataTypeCacheRefresher.cs b/src/Umbraco.Core/Cache/DataTypeCacheRefresher.cs index d5e11e17d3..0eca1a0c20 100644 --- a/src/Umbraco.Core/Cache/DataTypeCacheRefresher.cs +++ b/src/Umbraco.Core/Cache/DataTypeCacheRefresher.cs @@ -1,4 +1,5 @@ using System; +using Umbraco.Cms.Core.Events; using Umbraco.Cms.Core.Models; using Umbraco.Cms.Core.Models.PublishedContent; using Umbraco.Cms.Core.PropertyEditors.ValueConverters; @@ -9,14 +10,20 @@ using Umbraco.Extensions; namespace Umbraco.Cms.Core.Cache { - public sealed class DataTypeCacheRefresher : PayloadCacheRefresherBase + public sealed class DataTypeCacheRefresher : PayloadCacheRefresherBase { private readonly IPublishedSnapshotService _publishedSnapshotService; private readonly IPublishedModelFactory _publishedModelFactory; private readonly IIdKeyMap _idKeyMap; - public DataTypeCacheRefresher(AppCaches appCaches, IJsonSerializer serializer, IPublishedSnapshotService publishedSnapshotService, IPublishedModelFactory publishedModelFactory, IIdKeyMap idKeyMap) - : base(appCaches, serializer) + public DataTypeCacheRefresher( + AppCaches appCaches, + IJsonSerializer serializer, + IPublishedSnapshotService publishedSnapshotService, + IPublishedModelFactory publishedModelFactory, + IIdKeyMap idKeyMap, + IEventAggregator eventAggregator) + : base(appCaches, serializer, eventAggregator) { _publishedSnapshotService = publishedSnapshotService; _publishedModelFactory = publishedModelFactory; @@ -25,8 +32,6 @@ namespace Umbraco.Cms.Core.Cache #region Define - protected override DataTypeCacheRefresher This => this; - public static readonly Guid UniqueId = Guid.Parse("35B16C25-A17E-45D7-BC8F-EDAB1DCC28D2"); public override Guid RefresherUniqueId => UniqueId; diff --git a/src/Umbraco.Core/Cache/DictionaryCacheRefresher.cs b/src/Umbraco.Core/Cache/DictionaryCacheRefresher.cs index 922afab8da..8e21146a96 100644 --- a/src/Umbraco.Core/Cache/DictionaryCacheRefresher.cs +++ b/src/Umbraco.Core/Cache/DictionaryCacheRefresher.cs @@ -1,18 +1,17 @@ using System; +using Umbraco.Cms.Core.Events; using Umbraco.Cms.Core.Models; namespace Umbraco.Cms.Core.Cache { - public sealed class DictionaryCacheRefresher : CacheRefresherBase + public sealed class DictionaryCacheRefresher : CacheRefresherBase { - public DictionaryCacheRefresher(AppCaches appCaches) - : base(appCaches) + public DictionaryCacheRefresher(AppCaches appCaches, IEventAggregator eventAggregator) + : base(appCaches, eventAggregator) { } #region Define - protected override DictionaryCacheRefresher This => this; - public static readonly Guid UniqueId = Guid.Parse("D1D7E227-F817-4816-BFE9-6C39B6152884"); public override Guid RefresherUniqueId => UniqueId; diff --git a/src/Umbraco.Core/Cache/DomainCacheRefresher.cs b/src/Umbraco.Core/Cache/DomainCacheRefresher.cs index 2773ca2d0f..098b200632 100644 --- a/src/Umbraco.Core/Cache/DomainCacheRefresher.cs +++ b/src/Umbraco.Core/Cache/DomainCacheRefresher.cs @@ -1,4 +1,5 @@ using System; +using Umbraco.Cms.Core.Events; using Umbraco.Cms.Core.Models; using Umbraco.Cms.Core.PublishedCache; using Umbraco.Cms.Core.Serialization; @@ -6,20 +7,22 @@ using Umbraco.Cms.Core.Services.Changes; namespace Umbraco.Cms.Core.Cache { - public sealed class DomainCacheRefresher : PayloadCacheRefresherBase + public sealed class DomainCacheRefresher : PayloadCacheRefresherBase { private readonly IPublishedSnapshotService _publishedSnapshotService; - public DomainCacheRefresher(AppCaches appCaches, IJsonSerializer serializer, IPublishedSnapshotService publishedSnapshotService) - : base(appCaches, serializer) + public DomainCacheRefresher( + AppCaches appCaches, + IJsonSerializer serializer, + IPublishedSnapshotService publishedSnapshotService, + IEventAggregator eventAggregator) + : base(appCaches, serializer, eventAggregator) { _publishedSnapshotService = publishedSnapshotService; } #region Define - protected override DomainCacheRefresher This => this; - public static readonly Guid UniqueId = Guid.Parse("11290A79-4B57-4C99-AD72-7748A3CF38AF"); public override Guid RefresherUniqueId => UniqueId; diff --git a/src/Umbraco.Core/Cache/JsonCacheRefresherBase.cs b/src/Umbraco.Core/Cache/JsonCacheRefresherBase.cs index 3e70bc54eb..4ad5842373 100644 --- a/src/Umbraco.Core/Cache/JsonCacheRefresherBase.cs +++ b/src/Umbraco.Core/Cache/JsonCacheRefresherBase.cs @@ -1,4 +1,5 @@ -using Umbraco.Cms.Core.Serialization; +using Umbraco.Cms.Core.Events; +using Umbraco.Cms.Core.Serialization; using Umbraco.Cms.Core.Sync; namespace Umbraco.Cms.Core.Cache @@ -8,8 +9,8 @@ namespace Umbraco.Cms.Core.Cache /// /// The actual cache refresher type. /// The actual cache refresher type is used for strongly typed events. - public abstract class JsonCacheRefresherBase : CacheRefresherBase, IJsonCacheRefresher - where TInstanceType : class, ICacheRefresher + public abstract class JsonCacheRefresherBase : CacheRefresherBase, IJsonCacheRefresher + where TNotification : CacheRefresherNotificationBase, new() { protected IJsonSerializer JsonSerializer { get; } @@ -17,7 +18,11 @@ namespace Umbraco.Cms.Core.Cache /// Initializes a new instance of the . /// /// A cache helper. - protected JsonCacheRefresherBase(AppCaches appCaches, IJsonSerializer jsonSerializer) : base(appCaches) + protected JsonCacheRefresherBase( + AppCaches appCaches, + IJsonSerializer jsonSerializer, + IEventAggregator eventAggregator) + : base(appCaches, eventAggregator) { JsonSerializer = jsonSerializer; } @@ -28,7 +33,7 @@ namespace Umbraco.Cms.Core.Cache /// The json payload. public virtual void Refresh(string json) { - OnCacheUpdated(This, new CacheRefresherEventArgs(json, MessageType.RefreshByJson)); + OnCacheUpdated(new TNotification().Init(json, MessageType.RefreshByJson)); } #region Json diff --git a/src/Umbraco.Core/Cache/LanguageCacheRefresher.cs b/src/Umbraco.Core/Cache/LanguageCacheRefresher.cs index b15d247ddf..1e9ff228df 100644 --- a/src/Umbraco.Core/Cache/LanguageCacheRefresher.cs +++ b/src/Umbraco.Core/Cache/LanguageCacheRefresher.cs @@ -1,4 +1,5 @@ using System; +using Umbraco.Cms.Core.Events; using Umbraco.Cms.Core.Models; using Umbraco.Cms.Core.PublishedCache; using Umbraco.Cms.Core.Serialization; @@ -7,18 +8,20 @@ using static Umbraco.Cms.Core.Cache.LanguageCacheRefresher.JsonPayload; namespace Umbraco.Cms.Core.Cache { - public sealed class LanguageCacheRefresher : PayloadCacheRefresherBase + public sealed class LanguageCacheRefresher : PayloadCacheRefresherBase { - public LanguageCacheRefresher(AppCaches appCaches, IJsonSerializer serializer, IPublishedSnapshotService publishedSnapshotService) - : base(appCaches, serializer) + public LanguageCacheRefresher( + AppCaches appCaches, + IJsonSerializer serializer, + IPublishedSnapshotService publishedSnapshotService, + IEventAggregator eventAggregator) + : base(appCaches, serializer, eventAggregator) { _publishedSnapshotService = publishedSnapshotService; } #region Define - protected override LanguageCacheRefresher This => this; - public static readonly Guid UniqueId = Guid.Parse("3E0F95D8-0BE5-44B8-8394-2B8750B62654"); private readonly IPublishedSnapshotService _publishedSnapshotService; diff --git a/src/Umbraco.Core/Cache/MacroCacheRefresher.cs b/src/Umbraco.Core/Cache/MacroCacheRefresher.cs index dd4c4c73de..5e6c3294ab 100644 --- a/src/Umbraco.Core/Cache/MacroCacheRefresher.cs +++ b/src/Umbraco.Core/Cache/MacroCacheRefresher.cs @@ -1,23 +1,25 @@ using System; using System.Linq; +using Umbraco.Cms.Core.Events; using Umbraco.Cms.Core.Models; using Umbraco.Cms.Core.Persistence.Repositories; using Umbraco.Cms.Core.Serialization; namespace Umbraco.Cms.Core.Cache { - public sealed class MacroCacheRefresher : PayloadCacheRefresherBase + public sealed class MacroCacheRefresher : PayloadCacheRefresherBase { - public MacroCacheRefresher(AppCaches appCaches, IJsonSerializer jsonSerializer) - : base(appCaches, jsonSerializer) + public MacroCacheRefresher( + AppCaches appCaches, + IJsonSerializer jsonSerializer, + IEventAggregator eventAggregator) + : base(appCaches, jsonSerializer, eventAggregator) { } #region Define - protected override MacroCacheRefresher This => this; - public static readonly Guid UniqueId = Guid.Parse("7B1E683C-5F34-43dd-803D-9699EA1E98CA"); public override Guid RefresherUniqueId => UniqueId; diff --git a/src/Umbraco.Core/Cache/MediaCacheRefresher.cs b/src/Umbraco.Core/Cache/MediaCacheRefresher.cs index 997083b0a7..a4f424acf2 100644 --- a/src/Umbraco.Core/Cache/MediaCacheRefresher.cs +++ b/src/Umbraco.Core/Cache/MediaCacheRefresher.cs @@ -1,4 +1,5 @@ using System; +using Umbraco.Cms.Core.Events; using Umbraco.Cms.Core.Models; using Umbraco.Cms.Core.Persistence.Repositories; using Umbraco.Cms.Core.PublishedCache; @@ -9,13 +10,13 @@ using Umbraco.Extensions; namespace Umbraco.Cms.Core.Cache { - public sealed class MediaCacheRefresher : PayloadCacheRefresherBase + public sealed class MediaCacheRefresher : PayloadCacheRefresherBase { private readonly IPublishedSnapshotService _publishedSnapshotService; private readonly IIdKeyMap _idKeyMap; - public MediaCacheRefresher(AppCaches appCaches, IJsonSerializer serializer, IPublishedSnapshotService publishedSnapshotService, IIdKeyMap idKeyMap) - : base(appCaches, serializer) + public MediaCacheRefresher(AppCaches appCaches, IJsonSerializer serializer, IPublishedSnapshotService publishedSnapshotService, IIdKeyMap idKeyMap, IEventAggregator eventAggregator) + : base(appCaches, serializer, eventAggregator) { _publishedSnapshotService = publishedSnapshotService; _idKeyMap = idKeyMap; @@ -23,8 +24,6 @@ namespace Umbraco.Cms.Core.Cache #region Define - protected override MediaCacheRefresher This => this; - public static readonly Guid UniqueId = Guid.Parse("B29286DD-2D40-4DDB-B325-681226589FEC"); public override Guid RefresherUniqueId => UniqueId; diff --git a/src/Umbraco.Core/Cache/MemberCacheRefresher.cs b/src/Umbraco.Core/Cache/MemberCacheRefresher.cs index 0932725fe4..40f324384b 100644 --- a/src/Umbraco.Core/Cache/MemberCacheRefresher.cs +++ b/src/Umbraco.Core/Cache/MemberCacheRefresher.cs @@ -1,6 +1,7 @@ //using Newtonsoft.Json; using System; +using Umbraco.Cms.Core.Events; using Umbraco.Cms.Core.Models; using Umbraco.Cms.Core.Persistence.Repositories; using Umbraco.Cms.Core.Serialization; @@ -9,12 +10,12 @@ using Umbraco.Extensions; namespace Umbraco.Cms.Core.Cache { - public sealed class MemberCacheRefresher : PayloadCacheRefresherBase + public sealed class MemberCacheRefresher : PayloadCacheRefresherBase { private readonly IIdKeyMap _idKeyMap; - public MemberCacheRefresher(AppCaches appCaches, IJsonSerializer serializer, IIdKeyMap idKeyMap) - : base(appCaches, serializer) + public MemberCacheRefresher(AppCaches appCaches, IJsonSerializer serializer, IIdKeyMap idKeyMap, IEventAggregator eventAggregator) + : base(appCaches, serializer, eventAggregator) { _idKeyMap = idKeyMap; } @@ -36,8 +37,6 @@ namespace Umbraco.Cms.Core.Cache #region Define - protected override MemberCacheRefresher This => this; - public static readonly Guid UniqueId = Guid.Parse("E285DF34-ACDC-4226-AE32-C0CB5CF388DA"); public override Guid RefresherUniqueId => UniqueId; diff --git a/src/Umbraco.Core/Cache/MemberGroupCacheRefresher.cs b/src/Umbraco.Core/Cache/MemberGroupCacheRefresher.cs index 2db947d026..637d4c8558 100644 --- a/src/Umbraco.Core/Cache/MemberGroupCacheRefresher.cs +++ b/src/Umbraco.Core/Cache/MemberGroupCacheRefresher.cs @@ -1,21 +1,20 @@ using System; +using Umbraco.Cms.Core.Events; using Umbraco.Cms.Core.Models; using Umbraco.Cms.Core.Serialization; namespace Umbraco.Cms.Core.Cache { - public sealed class MemberGroupCacheRefresher : PayloadCacheRefresherBase + public sealed class MemberGroupCacheRefresher : PayloadCacheRefresherBase { - public MemberGroupCacheRefresher(AppCaches appCaches, IJsonSerializer jsonSerializer) - : base(appCaches, jsonSerializer) + public MemberGroupCacheRefresher(AppCaches appCaches, IJsonSerializer jsonSerializer, IEventAggregator eventAggregator) + : base(appCaches, jsonSerializer, eventAggregator) { } #region Define - protected override MemberGroupCacheRefresher This => this; - public static readonly Guid UniqueId = Guid.Parse("187F236B-BD21-4C85-8A7C-29FBA3D6C00C"); public override Guid RefresherUniqueId => UniqueId; diff --git a/src/Umbraco.Core/Cache/PayloadCacheRefresherBase.cs b/src/Umbraco.Core/Cache/PayloadCacheRefresherBase.cs index 08d3e65506..dd11e899c0 100644 --- a/src/Umbraco.Core/Cache/PayloadCacheRefresherBase.cs +++ b/src/Umbraco.Core/Cache/PayloadCacheRefresherBase.cs @@ -1,4 +1,5 @@ -using Umbraco.Cms.Core.Serialization; +using Umbraco.Cms.Core.Events; +using Umbraco.Cms.Core.Serialization; using Umbraco.Cms.Core.Sync; namespace Umbraco.Cms.Core.Cache @@ -9,8 +10,9 @@ namespace Umbraco.Cms.Core.Cache /// The actual cache refresher type. /// The payload type. /// The actual cache refresher type is used for strongly typed events. - public abstract class PayloadCacheRefresherBase : JsonCacheRefresherBase, IPayloadCacheRefresher - where TInstanceType : class, ICacheRefresher + public abstract class PayloadCacheRefresherBase : JsonCacheRefresherBase, IPayloadCacheRefresher + where TNotification : CacheRefresherNotificationBase, new() + { /// @@ -18,7 +20,8 @@ namespace Umbraco.Cms.Core.Cache /// /// A cache helper. /// - protected PayloadCacheRefresherBase(AppCaches appCaches, IJsonSerializer serializer) : base(appCaches, serializer) + protected PayloadCacheRefresherBase(AppCaches appCaches, IJsonSerializer serializer, IEventAggregator eventAggregator) + : base(appCaches, serializer, eventAggregator) { } @@ -37,7 +40,7 @@ namespace Umbraco.Cms.Core.Cache /// The payload. public virtual void Refresh(TPayload[] payloads) { - OnCacheUpdated(This, new CacheRefresherEventArgs(payloads, MessageType.RefreshByPayload)); + OnCacheUpdated(new TNotification().Init(payloads, MessageType.RefreshByPayload)); } #endregion diff --git a/src/Umbraco.Core/Cache/PublicAccessCacheRefresher.cs b/src/Umbraco.Core/Cache/PublicAccessCacheRefresher.cs index 19064a8031..44b108fa23 100644 --- a/src/Umbraco.Core/Cache/PublicAccessCacheRefresher.cs +++ b/src/Umbraco.Core/Cache/PublicAccessCacheRefresher.cs @@ -1,18 +1,17 @@ using System; +using Umbraco.Cms.Core.Events; using Umbraco.Cms.Core.Models; namespace Umbraco.Cms.Core.Cache { - public sealed class PublicAccessCacheRefresher : CacheRefresherBase + public sealed class PublicAccessCacheRefresher : CacheRefresherBase { - public PublicAccessCacheRefresher(AppCaches appCaches) - : base(appCaches) + public PublicAccessCacheRefresher(AppCaches appCaches, IEventAggregator eventAggregator) + : base(appCaches, eventAggregator) { } #region Define - protected override PublicAccessCacheRefresher This => this; - public static readonly Guid UniqueId = Guid.Parse("1DB08769-B104-4F8B-850E-169CAC1DF2EC"); public override Guid RefresherUniqueId => UniqueId; diff --git a/src/Umbraco.Core/Cache/RelationTypeCacheRefresher.cs b/src/Umbraco.Core/Cache/RelationTypeCacheRefresher.cs index daa954b257..d82cef759d 100644 --- a/src/Umbraco.Core/Cache/RelationTypeCacheRefresher.cs +++ b/src/Umbraco.Core/Cache/RelationTypeCacheRefresher.cs @@ -1,19 +1,18 @@ using System; +using Umbraco.Cms.Core.Events; using Umbraco.Cms.Core.Models; using Umbraco.Cms.Core.Persistence.Repositories; namespace Umbraco.Cms.Core.Cache { - public sealed class RelationTypeCacheRefresher : CacheRefresherBase + public sealed class RelationTypeCacheRefresher : CacheRefresherBase { - public RelationTypeCacheRefresher(AppCaches appCaches) - : base(appCaches) + public RelationTypeCacheRefresher(AppCaches appCaches, IEventAggregator eventAggregator) + : base(appCaches, eventAggregator) { } #region Define - protected override RelationTypeCacheRefresher This => this; - public static readonly Guid UniqueId = Guid.Parse("D8375ABA-4FB3-4F86-B505-92FBA1B6F7C9"); public override Guid RefresherUniqueId => UniqueId; diff --git a/src/Umbraco.Core/Cache/TemplateCacheRefresher.cs b/src/Umbraco.Core/Cache/TemplateCacheRefresher.cs index d02d3190eb..6c33a44545 100644 --- a/src/Umbraco.Core/Cache/TemplateCacheRefresher.cs +++ b/src/Umbraco.Core/Cache/TemplateCacheRefresher.cs @@ -1,17 +1,18 @@ using System; +using Umbraco.Cms.Core.Events; using Umbraco.Cms.Core.Models; using Umbraco.Cms.Core.Persistence.Repositories; using Umbraco.Cms.Core.Services; namespace Umbraco.Cms.Core.Cache { - public sealed class TemplateCacheRefresher : CacheRefresherBase + public sealed class TemplateCacheRefresher : CacheRefresherBase { private readonly IIdKeyMap _idKeyMap; private readonly IContentTypeCommonRepository _contentTypeCommonRepository; - public TemplateCacheRefresher(AppCaches appCaches, IIdKeyMap idKeyMap, IContentTypeCommonRepository contentTypeCommonRepository) - : base(appCaches) + public TemplateCacheRefresher(AppCaches appCaches, IIdKeyMap idKeyMap, IContentTypeCommonRepository contentTypeCommonRepository, IEventAggregator eventAggregator) + : base(appCaches, eventAggregator) { _idKeyMap = idKeyMap; _contentTypeCommonRepository = contentTypeCommonRepository; @@ -19,8 +20,6 @@ namespace Umbraco.Cms.Core.Cache #region Define - protected override TemplateCacheRefresher This => this; - public static readonly Guid UniqueId = Guid.Parse("DD12B6A0-14B9-46e8-8800-C154F74047C8"); public override Guid RefresherUniqueId => UniqueId; diff --git a/src/Umbraco.Core/Cache/UserCacheRefresher.cs b/src/Umbraco.Core/Cache/UserCacheRefresher.cs index 6cb3eb7f88..b8fd75702e 100644 --- a/src/Umbraco.Core/Cache/UserCacheRefresher.cs +++ b/src/Umbraco.Core/Cache/UserCacheRefresher.cs @@ -1,19 +1,18 @@ using System; +using Umbraco.Cms.Core.Events; using Umbraco.Cms.Core.Models.Membership; using Umbraco.Cms.Core.Persistence.Repositories; namespace Umbraco.Cms.Core.Cache { - public sealed class UserCacheRefresher : CacheRefresherBase + public sealed class UserCacheRefresher : CacheRefresherBase { - public UserCacheRefresher(AppCaches appCaches) - : base(appCaches) + public UserCacheRefresher(AppCaches appCaches, IEventAggregator eventAggregator) + : base(appCaches, eventAggregator) { } #region Define - protected override UserCacheRefresher This => this; - public static readonly Guid UniqueId = Guid.Parse("E057AF6D-2EE6-41F4-8045-3694010F0AA6"); public override Guid RefresherUniqueId => UniqueId; @@ -47,7 +46,7 @@ namespace Umbraco.Cms.Core.Cache userCache.Result.ClearByKey(CacheKeys.UserAllContentStartNodesPrefix + id); userCache.Result.ClearByKey(CacheKeys.UserAllMediaStartNodesPrefix + id); } - + base.Remove(id); } diff --git a/src/Umbraco.Core/Cache/UserGroupCacheRefresher.cs b/src/Umbraco.Core/Cache/UserGroupCacheRefresher.cs index 7519994069..f4456ef696 100644 --- a/src/Umbraco.Core/Cache/UserGroupCacheRefresher.cs +++ b/src/Umbraco.Core/Cache/UserGroupCacheRefresher.cs @@ -1,4 +1,5 @@ using System; +using Umbraco.Cms.Core.Events; using Umbraco.Cms.Core.Models.Membership; using Umbraco.Cms.Core.Persistence.Repositories; @@ -10,16 +11,14 @@ namespace Umbraco.Cms.Core.Cache /// /// This also needs to clear the user cache since IReadOnlyUserGroup's are attached to IUser objects /// - public sealed class UserGroupCacheRefresher : CacheRefresherBase + public sealed class UserGroupCacheRefresher : CacheRefresherBase { - public UserGroupCacheRefresher(AppCaches appCaches) - : base(appCaches) + public UserGroupCacheRefresher(AppCaches appCaches, IEventAggregator eventAggregator) + : base(appCaches, eventAggregator) { } #region Define - protected override UserGroupCacheRefresher This => this; - public static readonly Guid UniqueId = Guid.Parse("45178038-B232-4FE8-AA1A-F2B949C44762"); public override Guid RefresherUniqueId => UniqueId; diff --git a/src/Umbraco.Core/Umbraco.Core.csproj b/src/Umbraco.Core/Umbraco.Core.csproj index ce524a09a1..0cbbee528e 100644 --- a/src/Umbraco.Core/Umbraco.Core.csproj +++ b/src/Umbraco.Core/Umbraco.Core.csproj @@ -51,4 +51,8 @@ + + + + diff --git a/src/Umbraco.Infrastructure/Search/ExamineComposer.cs b/src/Umbraco.Infrastructure/DependencyInjection/UmbracoBuilder.Examine.cs similarity index 69% rename from src/Umbraco.Infrastructure/Search/ExamineComposer.cs rename to src/Umbraco.Infrastructure/DependencyInjection/UmbracoBuilder.Examine.cs index 45ba3c461e..033ab76298 100644 --- a/src/Umbraco.Infrastructure/Search/ExamineComposer.cs +++ b/src/Umbraco.Infrastructure/DependencyInjection/UmbracoBuilder.Examine.cs @@ -1,25 +1,25 @@ using Microsoft.Extensions.DependencyInjection; -using Umbraco.Cms.Core.Composing; +using Umbraco.Cms.Core.Cache; using Umbraco.Cms.Core.DependencyInjection; +using Umbraco.Cms.Core.Events; using Umbraco.Cms.Core.Models; using Umbraco.Cms.Core.PropertyEditors; using Umbraco.Cms.Core.Scoping; using Umbraco.Cms.Core.Services; using Umbraco.Cms.Core.Strings; using Umbraco.Cms.Infrastructure.Examine; +using Umbraco.Cms.Infrastructure.Search; using Umbraco.Extensions; -namespace Umbraco.Cms.Infrastructure.Search +namespace Umbraco.Cms.Infrastructure.DependencyInjection { /// - /// Configures and installs Examine. + /// Provides extension methods to the class. /// - public sealed class ExamineComposer : ComponentComposer, ICoreComposer + public static partial class UmbracoBuilderExtensions { - public override void Compose(IUmbracoBuilder builder) + public static IUmbracoBuilder AddExamine(this IUmbracoBuilder builder) { - base.Compose(builder); - // populators are not a collection: one cannot remove ours, and can only add more // the container can inject IEnumerable and get them all builder.Services.AddSingleton(); @@ -49,6 +49,15 @@ namespace Umbraco.Cms.Infrastructure.Search builder.Services.AddUnique, MediaValueSetBuilder>(); builder.Services.AddUnique, MemberValueSetBuilder>(); builder.Services.AddUnique(); + + builder.AddNotificationHandler(); + builder.AddNotificationHandler(); + builder.AddNotificationHandler(); + builder.AddNotificationHandler(); + builder.AddNotificationHandler(); + builder.AddNotificationHandler(); + + return builder; } } } diff --git a/src/Umbraco.Infrastructure/ModelsBuilder/LiveModelsProvider.cs b/src/Umbraco.Infrastructure/ModelsBuilder/LiveModelsProvider.cs index 2c0a71016a..9ff03e4d45 100644 --- a/src/Umbraco.Infrastructure/ModelsBuilder/LiveModelsProvider.cs +++ b/src/Umbraco.Infrastructure/ModelsBuilder/LiveModelsProvider.cs @@ -12,7 +12,10 @@ using Umbraco.Extensions; namespace Umbraco.Cms.Infrastructure.ModelsBuilder { // supports LiveAppData - but not PureLive - public sealed class LiveModelsProvider : INotificationHandler, INotificationHandler + public sealed class LiveModelsProvider : INotificationHandler, + INotificationHandler, + INotificationHandler, + INotificationHandler { private static int s_req; private readonly ILogger _logger; @@ -53,16 +56,6 @@ namespace Umbraco.Cms.Infrastructure.ModelsBuilder { return; } - - // Must register with maindom in order to function. - // If registration is not successful then events are not bound - // and we also don't generate models. - _mainDom.Register(() => - { - // anything changes, and we want to re-generate models. - ContentTypeCacheRefresher.CacheUpdated += RequestModelsGeneration; - DataTypeCacheRefresher.CacheUpdated += RequestModelsGeneration; - }); } // NOTE @@ -72,8 +65,13 @@ namespace Umbraco.Cms.Infrastructure.ModelsBuilder // need to be generated. Could be by another request. Anyway. We could // have collisions but... you know the risk. - private void RequestModelsGeneration(object sender, EventArgs args) + private void RequestModelsGeneration() { + if (!_mainDom.IsMainDom) + { + return; + } + _logger.LogDebug("Requested to generate models."); Interlocked.Exchange(ref s_req, 1); } @@ -121,5 +119,9 @@ namespace Umbraco.Cms.Infrastructure.ModelsBuilder GenerateModelsIfRequested(); } } + + public void Handle(ContentTypeCacheRefresherNotification notification) => RequestModelsGeneration(); + + public void Handle(DataTypeCacheRefresherNotification notification) => RequestModelsGeneration(); } } diff --git a/src/Umbraco.Infrastructure/ModelsBuilder/OutOfDateModelsStatus.cs b/src/Umbraco.Infrastructure/ModelsBuilder/OutOfDateModelsStatus.cs index 65a7ac3ef8..8b14a6030b 100644 --- a/src/Umbraco.Infrastructure/ModelsBuilder/OutOfDateModelsStatus.cs +++ b/src/Umbraco.Infrastructure/ModelsBuilder/OutOfDateModelsStatus.cs @@ -11,7 +11,8 @@ namespace Umbraco.Cms.Infrastructure.ModelsBuilder /// /// Used to track if ModelsBuilder models are out of date/stale /// - public sealed class OutOfDateModelsStatus : INotificationHandler + public sealed class OutOfDateModelsStatus : INotificationHandler, + INotificationHandler { private readonly ModelsBuilderSettings _config; private readonly IHostingEnvironment _hostingEnvironment; @@ -47,22 +48,6 @@ namespace Umbraco.Cms.Infrastructure.ModelsBuilder } } - /// - /// Handles the notification - /// - public void Handle(UmbracoApplicationStarting notification) => Install(); - - private void Install() - { - // don't run if not configured - if (!IsEnabled) - { - return; - } - - ContentTypeCacheRefresher.CacheUpdated += (sender, args) => Write(); - DataTypeCacheRefresher.CacheUpdated += (sender, args) => Write(); - } private string GetFlagPath() { @@ -77,6 +62,12 @@ namespace Umbraco.Cms.Infrastructure.ModelsBuilder private void Write() { + // don't run if not configured + if (!IsEnabled) + { + return; + } + var path = GetFlagPath(); if (path == null || File.Exists(path)) { @@ -101,5 +92,9 @@ namespace Umbraco.Cms.Infrastructure.ModelsBuilder File.Delete(path); } + + public void Handle(ContentTypeCacheRefresherNotification notification) => Write(); + + public void Handle(DataTypeCacheRefresherNotification notification) => Write(); } } diff --git a/src/Umbraco.Infrastructure/Search/ExamineComponent.cs b/src/Umbraco.Infrastructure/Search/ExamineNotificationHandler.cs similarity index 86% rename from src/Umbraco.Infrastructure/Search/ExamineComponent.cs rename to src/Umbraco.Infrastructure/Search/ExamineNotificationHandler.cs index 30dc01dc9a..dd95b6931e 100644 --- a/src/Umbraco.Infrastructure/Search/ExamineComponent.cs +++ b/src/Umbraco.Infrastructure/Search/ExamineNotificationHandler.cs @@ -7,7 +7,7 @@ using Examine; using Microsoft.Extensions.Logging; using Umbraco.Cms.Core; using Umbraco.Cms.Core.Cache; -using Umbraco.Cms.Core.Composing; +using Umbraco.Cms.Core.Events; using Umbraco.Cms.Core.Logging; using Umbraco.Cms.Core.Models; using Umbraco.Cms.Core.Runtime; @@ -20,7 +20,13 @@ using Umbraco.Extensions; namespace Umbraco.Cms.Infrastructure.Search { - public sealed class ExamineComponent : IComponent + public sealed class ExamineNotificationHandler : + INotificationHandler, + INotificationHandler, + INotificationHandler, + INotificationHandler, + INotificationHandler, + INotificationHandler { private readonly IExamineManager _examineManager; private readonly IContentValueSetBuilder _contentValueSetBuilder; @@ -33,18 +39,19 @@ namespace Umbraco.Cms.Infrastructure.Search private readonly ServiceContext _services; private readonly IMainDom _mainDom; private readonly IProfilingLogger _profilingLogger; - private readonly ILogger _logger; + private readonly ILogger _logger; private readonly IUmbracoIndexesCreator _indexCreator; + private static bool s_deactivate_handlers; // the default enlist priority is 100 // enlist with a lower priority to ensure that anything "default" runs after us // but greater that SafeXmlReaderWriter priority which is 60 private const int EnlistPriority = 80; - public ExamineComponent(IMainDom mainDom, + public ExamineNotificationHandler(IMainDom mainDom, IExamineManager examineManager, IProfilingLogger profilingLogger, - ILoggerFactory loggerFactory, + ILogger logger, IScopeProvider scopeProvider, IUmbracoIndexesCreator indexCreator, ServiceContext services, @@ -66,16 +73,15 @@ namespace Umbraco.Cms.Infrastructure.Search _taskHelper = taskHelper; _mainDom = mainDom; _profilingLogger = profilingLogger; - _logger = loggerFactory.CreateLogger(); + _logger = logger; _indexCreator = indexCreator; } - - public void Initialize() + public void Handle(UmbracoApplicationStarting notification) { //let's deal with shutting down Examine with MainDom var examineShutdownRegistered = _mainDom.Register(release: () => { - using (_profilingLogger.TraceDuration("Examine shutting down")) + using (_profilingLogger.TraceDuration("Examine shutting down")) { _examineManager.Dispose(); } @@ -105,26 +111,12 @@ namespace Umbraco.Cms.Infrastructure.Search // don't bind event handlers if we're not suppose to listen if (registeredIndexers == 0) { - return; + s_deactivate_handlers = true; } - // bind to distributed cache events - this ensures that this logic occurs on ALL servers - // that are taking part in a load balanced environment. - ContentCacheRefresher.CacheUpdated += ContentCacheRefresherUpdated; - ContentTypeCacheRefresher.CacheUpdated += ContentTypeCacheRefresherUpdated; - MediaCacheRefresher.CacheUpdated += MediaCacheRefresherUpdated; - MemberCacheRefresher.CacheUpdated += MemberCacheRefresherUpdated; - LanguageCacheRefresher.CacheUpdated += LanguageCacheRefresherUpdated; + } - public void Terminate() - { - ContentCacheRefresher.CacheUpdated -= ContentCacheRefresherUpdated; - ContentTypeCacheRefresher.CacheUpdated -= ContentTypeCacheRefresherUpdated; - MediaCacheRefresher.CacheUpdated -= MediaCacheRefresherUpdated; - MemberCacheRefresher.CacheUpdated -= MemberCacheRefresherUpdated; - LanguageCacheRefresher.CacheUpdated -= LanguageCacheRefresherUpdated; - } #region Cache refresher updated event handlers @@ -133,8 +125,12 @@ namespace Umbraco.Cms.Infrastructure.Search /// /// /// - private void ContentCacheRefresherUpdated(ContentCacheRefresher sender, CacheRefresherEventArgs args) + public void Handle(ContentCacheRefresherNotification args) { + if (s_deactivate_handlers) + { + return;; + } if (Suspendable.ExamineEvents.CanIndex == false) { return; @@ -237,8 +233,13 @@ namespace Umbraco.Cms.Infrastructure.Search } } - private void MemberCacheRefresherUpdated(MemberCacheRefresher sender, CacheRefresherEventArgs args) + public void Handle(MemberCacheRefresherNotification args) { + if (s_deactivate_handlers) + { + return;; + } + if (Suspendable.ExamineEvents.CanIndex == false) { return; @@ -300,8 +301,13 @@ namespace Umbraco.Cms.Infrastructure.Search } } - private void MediaCacheRefresherUpdated(MediaCacheRefresher sender, CacheRefresherEventArgs args) + public void Handle(MediaCacheRefresherNotification args) { + if (s_deactivate_handlers) + { + return;; + } + if (Suspendable.ExamineEvents.CanIndex == false) { return; @@ -364,9 +370,14 @@ namespace Umbraco.Cms.Infrastructure.Search } } - private void LanguageCacheRefresherUpdated(LanguageCacheRefresher sender, CacheRefresherEventArgs e) + public void Handle(LanguageCacheRefresherNotification args) { - if (!(e.MessageObject is LanguageCacheRefresher.JsonPayload[] payloads)) + if (s_deactivate_handlers) + { + return;; + } + + if (!(args.MessageObject is LanguageCacheRefresher.JsonPayload[] payloads)) { return; } @@ -393,8 +404,13 @@ namespace Umbraco.Cms.Infrastructure.Search /// /// /// - private void ContentTypeCacheRefresherUpdated(ContentTypeCacheRefresher sender, CacheRefresherEventArgs args) + public void Handle(ContentTypeCacheRefresherNotification args) { + if (s_deactivate_handlers) + { + return;; + } + if (Suspendable.ExamineEvents.CanIndex == false) { return; @@ -668,34 +684,34 @@ namespace Umbraco.Cms.Infrastructure.Search private class DeferedReIndexForContent : DeferedAction { private readonly TaskHelper _taskHelper; - private readonly ExamineComponent _examineComponent; + private readonly ExamineNotificationHandler _ExamineNotificationHandler; private readonly IContent _content; private readonly bool _isPublished; - public DeferedReIndexForContent(TaskHelper taskHelper, ExamineComponent examineComponent, IContent content, bool isPublished) + public DeferedReIndexForContent(TaskHelper taskHelper, ExamineNotificationHandler ExamineNotificationHandler, IContent content, bool isPublished) { _taskHelper = taskHelper; - _examineComponent = examineComponent; + _ExamineNotificationHandler = ExamineNotificationHandler; _content = content; _isPublished = isPublished; } - public override void Execute() => Execute(_taskHelper, _examineComponent, _content, _isPublished); + public override void Execute() => Execute(_taskHelper, _ExamineNotificationHandler, _content, _isPublished); - public static void Execute(TaskHelper taskHelper, ExamineComponent examineComponent, IContent content, bool isPublished) + public static void Execute(TaskHelper taskHelper, ExamineNotificationHandler ExamineNotificationHandler, IContent content, bool isPublished) => taskHelper.RunBackgroundTask(() => { - using IScope scope = examineComponent._scopeProvider.CreateScope(autoComplete: true); + using IScope scope = ExamineNotificationHandler._scopeProvider.CreateScope(autoComplete: true); // for content we have a different builder for published vs unpublished // we don't want to build more value sets than is needed so we'll lazily build 2 one for published one for non-published var builders = new Dictionary>> { - [true] = new Lazy>(() => examineComponent._publishedContentValueSetBuilder.GetValueSets(content).ToList()), - [false] = new Lazy>(() => examineComponent._contentValueSetBuilder.GetValueSets(content).ToList()) + [true] = new Lazy>(() => ExamineNotificationHandler._publishedContentValueSetBuilder.GetValueSets(content).ToList()), + [false] = new Lazy>(() => ExamineNotificationHandler._contentValueSetBuilder.GetValueSets(content).ToList()) }; - foreach (IUmbracoIndex index in examineComponent._examineManager.Indexes.OfType() + foreach (IUmbracoIndex index in ExamineNotificationHandler._examineManager.Indexes.OfType() //filter the indexers .Where(x => isPublished || !x.PublishedValuesOnly) .Where(x => x.EnableDefaultEventHandler)) @@ -714,29 +730,29 @@ namespace Umbraco.Cms.Infrastructure.Search private class DeferedReIndexForMedia : DeferedAction { private readonly TaskHelper _taskHelper; - private readonly ExamineComponent _examineComponent; + private readonly ExamineNotificationHandler _ExamineNotificationHandler; private readonly IMedia _media; private readonly bool _isPublished; - public DeferedReIndexForMedia(TaskHelper taskHelper, ExamineComponent examineComponent, IMedia media, bool isPublished) + public DeferedReIndexForMedia(TaskHelper taskHelper, ExamineNotificationHandler ExamineNotificationHandler, IMedia media, bool isPublished) { _taskHelper = taskHelper; - _examineComponent = examineComponent; + _ExamineNotificationHandler = ExamineNotificationHandler; _media = media; _isPublished = isPublished; } - public override void Execute() => Execute(_taskHelper, _examineComponent, _media, _isPublished); + public override void Execute() => Execute(_taskHelper, _ExamineNotificationHandler, _media, _isPublished); - public static void Execute(TaskHelper taskHelper, ExamineComponent examineComponent, IMedia media, bool isPublished) => + public static void Execute(TaskHelper taskHelper, ExamineNotificationHandler ExamineNotificationHandler, IMedia media, bool isPublished) => // perform the ValueSet lookup on a background thread taskHelper.RunBackgroundTask(() => { - using IScope scope = examineComponent._scopeProvider.CreateScope(autoComplete: true); + using IScope scope = ExamineNotificationHandler._scopeProvider.CreateScope(autoComplete: true); - var valueSet = examineComponent._mediaValueSetBuilder.GetValueSets(media).ToList(); + var valueSet = ExamineNotificationHandler._mediaValueSetBuilder.GetValueSets(media).ToList(); - foreach (IUmbracoIndex index in examineComponent._examineManager.Indexes.OfType() + foreach (IUmbracoIndex index in ExamineNotificationHandler._examineManager.Indexes.OfType() //filter the indexers .Where(x => isPublished || !x.PublishedValuesOnly) .Where(x => x.EnableDefaultEventHandler)) @@ -753,27 +769,27 @@ namespace Umbraco.Cms.Infrastructure.Search /// private class DeferedReIndexForMember : DeferedAction { - private readonly ExamineComponent _examineComponent; + private readonly ExamineNotificationHandler _ExamineNotificationHandler; private readonly IMember _member; private readonly TaskHelper _taskHelper; - public DeferedReIndexForMember(TaskHelper taskHelper, ExamineComponent examineComponent, IMember member) + public DeferedReIndexForMember(TaskHelper taskHelper, ExamineNotificationHandler ExamineNotificationHandler, IMember member) { - _examineComponent = examineComponent; + _ExamineNotificationHandler = ExamineNotificationHandler; _member = member; _taskHelper = taskHelper; } - public override void Execute() => Execute(_taskHelper, _examineComponent, _member); + public override void Execute() => Execute(_taskHelper, _ExamineNotificationHandler, _member); - public static void Execute(TaskHelper taskHelper, ExamineComponent examineComponent, IMember member) => + public static void Execute(TaskHelper taskHelper, ExamineNotificationHandler ExamineNotificationHandler, IMember member) => // perform the ValueSet lookup on a background thread taskHelper.RunBackgroundTask(() => { - using IScope scope = examineComponent._scopeProvider.CreateScope(autoComplete: true); + using IScope scope = ExamineNotificationHandler._scopeProvider.CreateScope(autoComplete: true); - var valueSet = examineComponent._memberValueSetBuilder.GetValueSets(member).ToList(); - foreach (IUmbracoIndex index in examineComponent._examineManager.Indexes.OfType() + var valueSet = ExamineNotificationHandler._memberValueSetBuilder.GetValueSets(member).ToList(); + foreach (IUmbracoIndex index in ExamineNotificationHandler._examineManager.Indexes.OfType() //filter the indexers .Where(x => x.EnableDefaultEventHandler)) { @@ -786,23 +802,23 @@ namespace Umbraco.Cms.Infrastructure.Search private class DeferedDeleteIndex : DeferedAction { - private readonly ExamineComponent _examineComponent; + private readonly ExamineNotificationHandler _ExamineNotificationHandler; private readonly int _id; private readonly bool _keepIfUnpublished; - public DeferedDeleteIndex(ExamineComponent examineComponent, int id, bool keepIfUnpublished) + public DeferedDeleteIndex(ExamineNotificationHandler ExamineNotificationHandler, int id, bool keepIfUnpublished) { - _examineComponent = examineComponent; + _ExamineNotificationHandler = ExamineNotificationHandler; _id = id; _keepIfUnpublished = keepIfUnpublished; } - public override void Execute() => Execute(_examineComponent, _id, _keepIfUnpublished); + public override void Execute() => Execute(_ExamineNotificationHandler, _id, _keepIfUnpublished); - public static void Execute(ExamineComponent examineComponent, int id, bool keepIfUnpublished) + public static void Execute(ExamineNotificationHandler ExamineNotificationHandler, int id, bool keepIfUnpublished) { var strId = id.ToString(CultureInfo.InvariantCulture); - foreach (var index in examineComponent._examineManager.Indexes.OfType() + foreach (var index in ExamineNotificationHandler._examineManager.Indexes.OfType() .Where(x => x.PublishedValuesOnly || !keepIfUnpublished) .Where(x => x.EnableDefaultEventHandler)) { @@ -811,7 +827,5 @@ namespace Umbraco.Cms.Infrastructure.Search } } #endregion - - } } diff --git a/src/Umbraco.Tests.Integration/Testing/UmbracoIntegrationTest.cs b/src/Umbraco.Tests.Integration/Testing/UmbracoIntegrationTest.cs index e73c0a5c5f..dbf047cf48 100644 --- a/src/Umbraco.Tests.Integration/Testing/UmbracoIntegrationTest.cs +++ b/src/Umbraco.Tests.Integration/Testing/UmbracoIntegrationTest.cs @@ -25,7 +25,6 @@ using Umbraco.Cms.Core.Configuration.Models; using Umbraco.Cms.Core.DependencyInjection; using Umbraco.Cms.Core.IO; using Umbraco.Cms.Core.Scoping; -using Umbraco.Cms.Core.Security; using Umbraco.Cms.Core.Services; using Umbraco.Cms.Core.Strings; using Umbraco.Cms.Core.Web; @@ -217,6 +216,7 @@ namespace Umbraco.Cms.Tests.Integration.Testing .AddBackOfficeAuthentication() .AddBackOfficeIdentity() .AddMembersIdentity() + .AddExamine() .AddTestServices(TestHelper, GetAppCaches()); if (TestOptions.Mapper) diff --git a/src/Umbraco.Tests.Integration/Umbraco.Infrastructure/Services/ContentEventsTests.cs b/src/Umbraco.Tests.Integration/Umbraco.Infrastructure/Services/ContentEventsTests.cs index c26d2e0e7b..0cf091ac65 100644 --- a/src/Umbraco.Tests.Integration/Umbraco.Infrastructure/Services/ContentEventsTests.cs +++ b/src/Umbraco.Tests.Integration/Umbraco.Infrastructure/Services/ContentEventsTests.cs @@ -8,7 +8,10 @@ using System.Collections.Generic; using System.Linq; using Microsoft.Extensions.Logging; using NUnit.Framework; +using Umbraco.Cms.Core; using Umbraco.Cms.Core.Cache; +using Umbraco.Cms.Core.DependencyInjection; +using Umbraco.Cms.Core.Events; using Umbraco.Cms.Core.Models; using Umbraco.Cms.Core.Sync; using Umbraco.Cms.Core.Web; @@ -18,7 +21,6 @@ using Umbraco.Cms.Tests.Common.Builders; using Umbraco.Cms.Tests.Common.Testing; using Umbraco.Cms.Tests.Integration.Testing; using Umbraco.Extensions; -using Constants = Umbraco.Cms.Core.Constants; namespace Umbraco.Cms.Tests.Integration.Umbraco.Infrastructure.Services { @@ -34,6 +36,40 @@ namespace Umbraco.Cms.Tests.Integration.Umbraco.Infrastructure.Services #region Setup + private class TestNotificationHandler : INotificationHandler + { + public void Handle(ContentCacheRefresherNotification args) + { + // reports the event as: "ContentCache/,.../X + // where + // is(are) the action(s) + // X is the event content ID + if (args.MessageType != MessageType.RefreshByPayload) + { + throw new NotSupportedException(); + } + + foreach (ContentCacheRefresher.JsonPayload payload in (ContentCacheRefresher.JsonPayload[])args.MessageObject) + { + var e = new EventInstance + { + Message = _msgCount, + Sender = "ContentCacheRefresher", + EventArgs = payload, + Name = payload.ChangeTypes.ToString().Replace(" ", string.Empty), + Args = payload.Id.ToInvariantString() + }; + _events.Add(e); + } + + _msgCount++; + } + } + protected override void CustomTestSetup(IUmbracoBuilder builder) + { + builder.AddNotificationHandler(); + } + [SetUp] public void SetUp() { @@ -45,7 +81,6 @@ namespace Umbraco.Cms.Tests.Integration.Umbraco.Infrastructure.Services DocumentRepository.ScopedEntityRefresh += ContentRepositoryRefreshed; DocumentRepository.ScopeEntityRemove += ContentRepositoryRemoved; DocumentRepository.ScopeVersionRemove += ContentRepositoryRemovedVersion; - ContentCacheRefresher.CacheUpdated += ContentCacheUpdated; // prepare content type Template template = TemplateBuilder.CreateTextPageTemplate(); @@ -66,12 +101,11 @@ namespace Umbraco.Cms.Tests.Integration.Umbraco.Infrastructure.Services DocumentRepository.ScopedEntityRefresh -= ContentRepositoryRefreshed; DocumentRepository.ScopeEntityRemove -= ContentRepositoryRemoved; DocumentRepository.ScopeVersionRemove -= ContentRepositoryRemovedVersion; - ContentCacheRefresher.CacheUpdated -= ContentCacheUpdated; } private DistributedCacheBinder _distributedCacheBinder; - private IList _events; - private int _msgCount; + private static IList _events; + private static int _msgCount; private IContentType _contentType; private void ResetEvents() @@ -324,32 +358,7 @@ namespace Umbraco.Cms.Tests.Integration.Umbraco.Infrastructure.Services _events.Add(e); } - private void ContentCacheUpdated(ContentCacheRefresher sender, CacheRefresherEventArgs args) - { - // reports the event as: "ContentCache/,.../X - // where - // is(are) the action(s) - // X is the event content ID - if (args.MessageType != MessageType.RefreshByPayload) - { - throw new NotSupportedException(); - } - foreach (ContentCacheRefresher.JsonPayload payload in (ContentCacheRefresher.JsonPayload[])args.MessageObject) - { - var e = new EventInstance - { - Message = _msgCount, - Sender = sender.Name, - EventArgs = payload, - Name = payload.ChangeTypes.ToString().Replace(" ", string.Empty), - Args = payload.Id.ToInvariantString() - }; - _events.Add(e); - } - - _msgCount++; - } private void WriteEvents() { diff --git a/src/Umbraco.Web.BackOffice/DependencyInjection/UmbracoBuilderExtensions.cs b/src/Umbraco.Web.BackOffice/DependencyInjection/UmbracoBuilderExtensions.cs index 098b2ba879..5356bc08f1 100644 --- a/src/Umbraco.Web.BackOffice/DependencyInjection/UmbracoBuilderExtensions.cs +++ b/src/Umbraco.Web.BackOffice/DependencyInjection/UmbracoBuilderExtensions.cs @@ -5,11 +5,11 @@ using Microsoft.AspNetCore.Authorization; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; using Umbraco.Cms.Core; +using Umbraco.Cms.Core.Cache; using Umbraco.Cms.Core.DependencyInjection; using Umbraco.Cms.Core.Hosting; using Umbraco.Cms.Core.IO; using Umbraco.Cms.Core.Services; -using Umbraco.Cms.Core.WebAssets; using Umbraco.Cms.Infrastructure.DependencyInjection; using Umbraco.Cms.Infrastructure.WebAssets; using Umbraco.Cms.Web.BackOffice.Controllers; @@ -19,6 +19,7 @@ using Umbraco.Cms.Web.BackOffice.ModelsBuilder; using Umbraco.Cms.Web.BackOffice.Routing; using Umbraco.Cms.Web.BackOffice.Security; using Umbraco.Cms.Web.BackOffice.Services; +using Umbraco.Cms.Web.BackOffice.SignalR; using Umbraco.Cms.Web.BackOffice.Trees; using Umbraco.Cms.Web.Common.Authorization; @@ -49,7 +50,8 @@ namespace Umbraco.Extensions .AddHostedServices() .AddDistributedCache() .AddModelsBuilderDashboard() - .AddUnattedInstallCreateUser(); + .AddUnattedInstallCreateUser() + .AddExamine(); /// /// Adds Umbraco back office authentication requirements @@ -153,6 +155,7 @@ namespace Umbraco.Extensions builder.Services.AddUnique(); builder.Services.AddUnique(); builder.Services.AddUnique(); + builder.AddNotificationAsyncHandler(); builder.Services.AddUnique(); builder.Services.AddScoped(); builder.Services.AddScoped(); diff --git a/src/Umbraco.Web.BackOffice/SignalR/PreviewHubComposer.cs b/src/Umbraco.Web.BackOffice/SignalR/PreviewHubComposer.cs deleted file mode 100644 index 18b8f90825..0000000000 --- a/src/Umbraco.Web.BackOffice/SignalR/PreviewHubComposer.cs +++ /dev/null @@ -1,13 +0,0 @@ -using Umbraco.Cms.Core.Composing; -using Umbraco.Cms.Core.DependencyInjection; - -namespace Umbraco.Cms.Web.BackOffice.SignalR -{ - public class PreviewHubComposer : ComponentComposer, ICoreComposer - { - public override void Compose(IUmbracoBuilder builder) - { - base.Compose(builder); - } - } -} diff --git a/src/Umbraco.Web.BackOffice/SignalR/PreviewHubComponent.cs b/src/Umbraco.Web.BackOffice/SignalR/PreviewHubUpdater.cs similarity index 54% rename from src/Umbraco.Web.BackOffice/SignalR/PreviewHubComponent.cs rename to src/Umbraco.Web.BackOffice/SignalR/PreviewHubUpdater.cs index 00d3dc8013..a71b5439d4 100644 --- a/src/Umbraco.Web.BackOffice/SignalR/PreviewHubComponent.cs +++ b/src/Umbraco.Web.BackOffice/SignalR/PreviewHubUpdater.cs @@ -1,38 +1,26 @@ using System; +using System.Threading; +using System.Threading.Tasks; using Microsoft.AspNetCore.SignalR; using Umbraco.Cms.Core.Cache; -using Umbraco.Cms.Core.Composing; +using Umbraco.Cms.Core.Events; using Umbraco.Cms.Core.Sync; namespace Umbraco.Cms.Web.BackOffice.SignalR { - public class PreviewHubComponent : IComponent + public class PreviewHubUpdater :INotificationAsyncHandler { private readonly Lazy> _hubContext; // using a lazy arg here means that we won't create the hub until necessary // and therefore we won't have too bad an impact on boot time - public PreviewHubComponent(Lazy> hubContext) + public PreviewHubUpdater(Lazy> hubContext) { _hubContext = hubContext; } - public void Initialize() - { - // ContentService.Saved is too soon - the content cache is not ready yet, - // so use the content cache refresher event, because when it triggers - // the cache has already been notified of the changes - ContentCacheRefresher.CacheUpdated += HandleCacheUpdated; - } - - public void Terminate() - { - ContentCacheRefresher.CacheUpdated -= HandleCacheUpdated; - } - - private async void HandleCacheUpdated(ContentCacheRefresher sender, CacheRefresherEventArgs args) - { + public async Task HandleAsync(ContentCacheRefresherNotification args, CancellationToken cancellationToken) { if (args.MessageType != MessageType.RefreshByPayload) return; var payloads = (ContentCacheRefresher.JsonPayload[])args.MessageObject; var hubContextInstance = _hubContext.Value; diff --git a/src/Umbraco.Web.Common/ModelsBuilder/DependencyInjection/UmbracoBuilderDependencyInjectionExtensions.cs b/src/Umbraco.Web.Common/ModelsBuilder/DependencyInjection/UmbracoBuilderDependencyInjectionExtensions.cs index 5ce05e62cd..e8b54d3af0 100644 --- a/src/Umbraco.Web.Common/ModelsBuilder/DependencyInjection/UmbracoBuilderDependencyInjectionExtensions.cs +++ b/src/Umbraco.Web.Common/ModelsBuilder/DependencyInjection/UmbracoBuilderDependencyInjectionExtensions.cs @@ -3,6 +3,7 @@ using Microsoft.AspNetCore.Mvc.Razor; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.DependencyInjection.Extensions; using Microsoft.Extensions.Options; +using Umbraco.Cms.Core.Cache; using Umbraco.Cms.Core.Configuration; using Umbraco.Cms.Core.Configuration.Models; using Umbraco.Cms.Core.DependencyInjection; @@ -102,10 +103,15 @@ namespace Umbraco.Extensions builder.AddNotificationHandler(); builder.AddNotificationHandler(); builder.AddNotificationHandler(); - builder.AddNotificationHandler(); + builder.AddNotificationHandler(); + builder.AddNotificationHandler(); + builder.Services.AddSingleton(); builder.Services.AddSingleton(); builder.Services.AddSingleton(); + builder.AddNotificationHandler(); + builder.AddNotificationHandler(); + builder.Services.AddSingleton(); builder.Services.AddSingleton(); builder.Services.AddSingleton(); From abf11c2d62dd0296bffeeb900cb0bb4b7b30f5f5 Mon Sep 17 00:00:00 2001 From: Bjarke Berg Date: Fri, 12 Mar 2021 21:50:47 +0100 Subject: [PATCH 2/8] Fixed issue with BackOfficeIdentity. Previews did not work, because we did not check for multiple identities on the priciple, after the move the pure ClaimsIdentity --- .../Extensions/ClaimsIdentityExtensions.cs | 8 +++- .../Security/ClaimsPrincipalExtensions.cs | 46 ++++++++++++++----- 2 files changed, 41 insertions(+), 13 deletions(-) diff --git a/src/Umbraco.Core/Extensions/ClaimsIdentityExtensions.cs b/src/Umbraco.Core/Extensions/ClaimsIdentityExtensions.cs index 7569b64cb7..57c69ee9aa 100644 --- a/src/Umbraco.Core/Extensions/ClaimsIdentityExtensions.cs +++ b/src/Umbraco.Core/Extensions/ClaimsIdentityExtensions.cs @@ -101,6 +101,12 @@ namespace Umbraco.Extensions /// True if ClaimsIdentity public static bool VerifyBackOfficeIdentity(this ClaimsIdentity identity, out ClaimsIdentity verifiedIdentity) { + if (identity is null) + { + verifiedIdentity = null; + return false; + } + // Validate that all required claims exist foreach (var claimType in RequiredBackOfficeClaimTypes) { @@ -112,7 +118,7 @@ namespace Umbraco.Extensions } } - verifiedIdentity = new ClaimsIdentity(identity.Claims, Constants.Security.BackOfficeAuthenticationType); + verifiedIdentity = identity.AuthenticationType == Constants.Security.BackOfficeAuthenticationType ? identity : new ClaimsIdentity(identity.Claims, Constants.Security.BackOfficeAuthenticationType); return true; } diff --git a/src/Umbraco.Core/Security/ClaimsPrincipalExtensions.cs b/src/Umbraco.Core/Security/ClaimsPrincipalExtensions.cs index ce0e0eb774..1ee5699868 100644 --- a/src/Umbraco.Core/Security/ClaimsPrincipalExtensions.cs +++ b/src/Umbraco.Core/Security/ClaimsPrincipalExtensions.cs @@ -7,31 +7,53 @@ using System.Linq; using System.Security.Claims; using System.Security.Principal; using Umbraco.Cms.Core; -using Umbraco.Cms.Core.Security; namespace Umbraco.Extensions { public static class ClaimsPrincipalExtensions { + + public static bool IsBackOfficeAuthenticationType(this ClaimsIdentity claimsIdentity) + { + if (claimsIdentity is null) + { + return false; + } + + return claimsIdentity.IsAuthenticated && claimsIdentity.AuthenticationType == Constants.Security.BackOfficeAuthenticationType; + } /// /// This will return the current back office identity if the IPrincipal is the correct type and authenticated. /// - /// + /// /// - public static ClaimsIdentity GetUmbracoIdentity(this IPrincipal user) + public static ClaimsIdentity GetUmbracoIdentity(this IPrincipal principal) { - // Check if the identity is a ClaimsIdentity, and that's it's authenticated and has all required claims. - if (user.Identity is ClaimsIdentity claimsIdentity - && claimsIdentity.IsAuthenticated - && claimsIdentity.VerifyBackOfficeIdentity(out ClaimsIdentity umbracoIdentity)) + //If it's already a UmbracoBackOfficeIdentity + if (principal.Identity is ClaimsIdentity claimsIdentity + && claimsIdentity.IsBackOfficeAuthenticationType() + && claimsIdentity.VerifyBackOfficeIdentity(out var backOfficeIdentity)) { - if (claimsIdentity.AuthenticationType == Constants.Security.BackOfficeAuthenticationType) - { - return claimsIdentity; - } - return umbracoIdentity; + return backOfficeIdentity; } + //Check if there's more than one identity assigned and see if it's a UmbracoBackOfficeIdentity and use that + // We can have assigned more identities if it is a preview request. + if (principal is ClaimsPrincipal claimsPrincipal ) + { + claimsIdentity = claimsPrincipal.Identities.FirstOrDefault(x=>x.IsBackOfficeAuthenticationType()); + if (claimsIdentity.VerifyBackOfficeIdentity(out backOfficeIdentity)) + { + return backOfficeIdentity; + } + } + + //Otherwise convert to a UmbracoBackOfficeIdentity if it's auth'd + if (principal.Identity is ClaimsIdentity claimsIdentity2 + && claimsIdentity2.VerifyBackOfficeIdentity(out backOfficeIdentity)) + { + return backOfficeIdentity; + } return null; } From e77d2d58c2ffbed2faf8999295a8bc5c9eb17d9b Mon Sep 17 00:00:00 2001 From: Bjarke Berg Date: Fri, 12 Mar 2021 22:03:30 +0100 Subject: [PATCH 3/8] Clean up --- src/Umbraco.Core/Umbraco.Core.csproj | 4 ---- 1 file changed, 4 deletions(-) diff --git a/src/Umbraco.Core/Umbraco.Core.csproj b/src/Umbraco.Core/Umbraco.Core.csproj index 0cbbee528e..ce524a09a1 100644 --- a/src/Umbraco.Core/Umbraco.Core.csproj +++ b/src/Umbraco.Core/Umbraco.Core.csproj @@ -51,8 +51,4 @@ - - - - From 86eb87a8858b8fc4764056ad12ed2f79a6e31532 Mon Sep 17 00:00:00 2001 From: Bjarke Berg Date: Fri, 12 Mar 2021 22:09:51 +0100 Subject: [PATCH 4/8] Clean up --- .../Search/ExamineNotificationHandler.cs | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/Umbraco.Infrastructure/Search/ExamineNotificationHandler.cs b/src/Umbraco.Infrastructure/Search/ExamineNotificationHandler.cs index dd95b6931e..b10bf70c10 100644 --- a/src/Umbraco.Infrastructure/Search/ExamineNotificationHandler.cs +++ b/src/Umbraco.Infrastructure/Search/ExamineNotificationHandler.cs @@ -129,7 +129,7 @@ namespace Umbraco.Cms.Infrastructure.Search { if (s_deactivate_handlers) { - return;; + return; } if (Suspendable.ExamineEvents.CanIndex == false) { @@ -237,7 +237,7 @@ namespace Umbraco.Cms.Infrastructure.Search { if (s_deactivate_handlers) { - return;; + return; } if (Suspendable.ExamineEvents.CanIndex == false) @@ -305,7 +305,7 @@ namespace Umbraco.Cms.Infrastructure.Search { if (s_deactivate_handlers) { - return;; + return; } if (Suspendable.ExamineEvents.CanIndex == false) @@ -374,7 +374,7 @@ namespace Umbraco.Cms.Infrastructure.Search { if (s_deactivate_handlers) { - return;; + return; } if (!(args.MessageObject is LanguageCacheRefresher.JsonPayload[] payloads)) @@ -408,7 +408,7 @@ namespace Umbraco.Cms.Infrastructure.Search { if (s_deactivate_handlers) { - return;; + return; } if (Suspendable.ExamineEvents.CanIndex == false) From f03fc25b4c49718218c1d0da64739b2aa1714d10 Mon Sep 17 00:00:00 2001 From: Shannon Date: Mon, 15 Mar 2021 13:39:34 +1100 Subject: [PATCH 5/8] Splits into files, adds ICacheRefresherNotificationFactory, removes Init method --- .../Cache/ApplicationCacheRefresher.cs | 9 +- .../ApplicationCacheRefresherNotification.cs | 11 +++ src/Umbraco.Core/Cache/CacheRefresherBase.cs | 24 ++++-- .../Cache/CacheRefresherNotification.cs | 22 +++++ .../Cache/CacheRefresherNotificationBase.cs | 83 ------------------- .../CacheRefresherNotificationFactory.cs | 22 +++++ .../Cache/ContentCacheRefresher.cs | 7 +- .../ContentCacheRefresherNotification.cs | 11 +++ .../Cache/ContentTypeCacheRefresher.cs | 7 +- .../ContentTypeCacheRefresherNotification.cs | 11 +++ .../Cache/DataTypeCacheRefresher.cs | 7 +- .../DataTypeCacheRefresherNotification.cs | 11 +++ .../Cache/DictionaryCacheRefresher.cs | 6 +- .../DictionaryCacheRefresherNotification.cs | 11 +++ .../Cache/DomainCacheRefresher.cs | 7 +- .../Cache/DomainCacheRefresherNotification.cs | 11 +++ .../ICacheRefresherNotificationFactory.cs | 16 ++++ .../Cache/JsonCacheRefresherBase.cs | 11 +-- .../Cache/LanguageCacheRefresher.cs | 7 +- .../LanguageCacheRefresherNotification.cs | 11 +++ src/Umbraco.Core/Cache/MacroCacheRefresher.cs | 7 +- .../Cache/MacroCacheRefresherNotification.cs | 11 +++ src/Umbraco.Core/Cache/MediaCacheRefresher.cs | 6 +- .../Cache/MediaCacheRefresherNotification.cs | 11 +++ .../Cache/MemberCacheRefresher.cs | 4 +- .../Cache/MemberCacheRefresherNotification.cs | 11 +++ .../Cache/MemberGroupCacheRefresher.cs | 6 +- .../MemberGroupCacheRefresherNotification.cs | 11 +++ .../Cache/PayloadCacheRefresherBase.cs | 11 ++- .../Cache/PublicAccessCacheRefresher.cs | 6 +- .../PublicAccessCacheRefresherNotification.cs | 11 +++ .../Cache/RelationTypeCacheRefresher.cs | 6 +- .../RelationTypeCacheRefresherNotification.cs | 11 +++ .../Cache/TemplateCacheRefresher.cs | 6 +- .../TemplateCacheRefresherNotification.cs | 11 +++ src/Umbraco.Core/Cache/UserCacheRefresher.cs | 6 +- .../Cache/UserCacheRefresherNotification.cs | 11 +++ .../Cache/UserGroupCacheRefresher.cs | 6 +- .../UserGroupCacheRefresherNotification.cs | 11 +++ .../DependencyInjection/UmbracoBuilder.cs | 1 + 40 files changed, 318 insertions(+), 151 deletions(-) create mode 100644 src/Umbraco.Core/Cache/ApplicationCacheRefresherNotification.cs create mode 100644 src/Umbraco.Core/Cache/CacheRefresherNotification.cs delete mode 100644 src/Umbraco.Core/Cache/CacheRefresherNotificationBase.cs create mode 100644 src/Umbraco.Core/Cache/CacheRefresherNotificationFactory.cs create mode 100644 src/Umbraco.Core/Cache/ContentCacheRefresherNotification.cs create mode 100644 src/Umbraco.Core/Cache/ContentTypeCacheRefresherNotification.cs create mode 100644 src/Umbraco.Core/Cache/DataTypeCacheRefresherNotification.cs create mode 100644 src/Umbraco.Core/Cache/DictionaryCacheRefresherNotification.cs create mode 100644 src/Umbraco.Core/Cache/DomainCacheRefresherNotification.cs create mode 100644 src/Umbraco.Core/Cache/ICacheRefresherNotificationFactory.cs create mode 100644 src/Umbraco.Core/Cache/LanguageCacheRefresherNotification.cs create mode 100644 src/Umbraco.Core/Cache/MacroCacheRefresherNotification.cs create mode 100644 src/Umbraco.Core/Cache/MediaCacheRefresherNotification.cs create mode 100644 src/Umbraco.Core/Cache/MemberCacheRefresherNotification.cs create mode 100644 src/Umbraco.Core/Cache/MemberGroupCacheRefresherNotification.cs create mode 100644 src/Umbraco.Core/Cache/PublicAccessCacheRefresherNotification.cs create mode 100644 src/Umbraco.Core/Cache/RelationTypeCacheRefresherNotification.cs create mode 100644 src/Umbraco.Core/Cache/TemplateCacheRefresherNotification.cs create mode 100644 src/Umbraco.Core/Cache/UserCacheRefresherNotification.cs create mode 100644 src/Umbraco.Core/Cache/UserGroupCacheRefresherNotification.cs diff --git a/src/Umbraco.Core/Cache/ApplicationCacheRefresher.cs b/src/Umbraco.Core/Cache/ApplicationCacheRefresher.cs index b8dccd1f59..8106da11e6 100644 --- a/src/Umbraco.Core/Cache/ApplicationCacheRefresher.cs +++ b/src/Umbraco.Core/Cache/ApplicationCacheRefresher.cs @@ -1,13 +1,14 @@ -using System; +using System; using Umbraco.Cms.Core.Events; namespace Umbraco.Cms.Core.Cache { public sealed class ApplicationCacheRefresher : CacheRefresherBase { - public ApplicationCacheRefresher(AppCaches appCaches, IEventAggregator eventAggregator) - : base(appCaches, eventAggregator) - { } + public ApplicationCacheRefresher(AppCaches appCaches, IEventAggregator eventAggregator, ICacheRefresherNotificationFactory factory) + : base(appCaches, eventAggregator, factory) + { + } #region Define diff --git a/src/Umbraco.Core/Cache/ApplicationCacheRefresherNotification.cs b/src/Umbraco.Core/Cache/ApplicationCacheRefresherNotification.cs new file mode 100644 index 0000000000..3602a1488f --- /dev/null +++ b/src/Umbraco.Core/Cache/ApplicationCacheRefresherNotification.cs @@ -0,0 +1,11 @@ +using Umbraco.Cms.Core.Sync; + +namespace Umbraco.Cms.Core.Cache +{ + public class ApplicationCacheRefresherNotification : CacheRefresherNotification + { + public ApplicationCacheRefresherNotification(object messageObject, MessageType messageType) : base(messageObject, messageType) + { + } + } +} diff --git a/src/Umbraco.Core/Cache/CacheRefresherBase.cs b/src/Umbraco.Core/Cache/CacheRefresherBase.cs index be4129f928..c5f3d903ab 100644 --- a/src/Umbraco.Core/Cache/CacheRefresherBase.cs +++ b/src/Umbraco.Core/Cache/CacheRefresherBase.cs @@ -1,4 +1,4 @@ -using System; +using System; using Umbraco.Cms.Core.Events; using Umbraco.Cms.Core.Models.Entities; using Umbraco.Cms.Core.Sync; @@ -10,17 +10,18 @@ namespace Umbraco.Cms.Core.Cache /// /// The actual cache refresher type. /// The actual cache refresher type is used for strongly typed events. - public abstract class CacheRefresherBase< TNotification> : ICacheRefresher - where TNotification : CacheRefresherNotificationBase, new() + public abstract class CacheRefresherBase : ICacheRefresher + where TNotification : CacheRefresherNotification { /// /// Initializes a new instance of the . /// /// A cache helper. - protected CacheRefresherBase(AppCaches appCaches, IEventAggregator eventAggregator) + protected CacheRefresherBase(AppCaches appCaches, IEventAggregator eventAggregator, ICacheRefresherNotificationFactory factory) { AppCaches = appCaches; EventAggregator = eventAggregator; + NotificationFactory = factory; } #region Define @@ -35,6 +36,11 @@ namespace Umbraco.Cms.Core.Cache /// public abstract string Name { get; } + /// + /// Gets the for + /// + protected ICacheRefresherNotificationFactory NotificationFactory { get; } + #endregion #region Refresher @@ -44,7 +50,7 @@ namespace Umbraco.Cms.Core.Cache /// public virtual void RefreshAll() { - OnCacheUpdated(new TNotification().Init(null, MessageType.RefreshAll)); + OnCacheUpdated(NotificationFactory.Create(null, MessageType.RefreshAll)); } /// @@ -53,7 +59,7 @@ namespace Umbraco.Cms.Core.Cache /// The entity's identifier. public virtual void Refresh(int id) { - OnCacheUpdated(new TNotification().Init(id, MessageType.RefreshById)); + OnCacheUpdated(NotificationFactory.Create(id, MessageType.RefreshById)); } /// @@ -62,7 +68,7 @@ namespace Umbraco.Cms.Core.Cache /// The entity's identifier. public virtual void Refresh(Guid id) { - OnCacheUpdated(new TNotification().Init(id, MessageType.RefreshById)); + OnCacheUpdated(NotificationFactory.Create(id, MessageType.RefreshById)); } /// @@ -71,7 +77,7 @@ namespace Umbraco.Cms.Core.Cache /// The entity's identifier. public virtual void Remove(int id) { - OnCacheUpdated(new TNotification().Init(id, MessageType.RemoveById)); + OnCacheUpdated(NotificationFactory.Create(id, MessageType.RemoveById)); } #endregion @@ -100,7 +106,7 @@ namespace Umbraco.Cms.Core.Cache /// /// The event sender. /// The event arguments. - protected void OnCacheUpdated(CacheRefresherNotificationBase notification) + protected void OnCacheUpdated(CacheRefresherNotification notification) { EventAggregator.Publish(notification); } diff --git a/src/Umbraco.Core/Cache/CacheRefresherNotification.cs b/src/Umbraco.Core/Cache/CacheRefresherNotification.cs new file mode 100644 index 0000000000..442fad0147 --- /dev/null +++ b/src/Umbraco.Core/Cache/CacheRefresherNotification.cs @@ -0,0 +1,22 @@ +using System; +using Umbraco.Cms.Core.Events; +using Umbraco.Cms.Core.Sync; +using Umbraco.Extensions; + +namespace Umbraco.Cms.Core.Cache +{ + /// + /// Base class for cache refresher notifications + /// + public abstract class CacheRefresherNotification : INotification + { + public CacheRefresherNotification(object messageObject, MessageType messageType) + { + MessageObject = messageObject ?? throw new ArgumentNullException(nameof(messageObject)); + MessageType = messageType; + } + + public object MessageObject { get; } + public MessageType MessageType { get; } + } +} diff --git a/src/Umbraco.Core/Cache/CacheRefresherNotificationBase.cs b/src/Umbraco.Core/Cache/CacheRefresherNotificationBase.cs deleted file mode 100644 index 7818678cfe..0000000000 --- a/src/Umbraco.Core/Cache/CacheRefresherNotificationBase.cs +++ /dev/null @@ -1,83 +0,0 @@ -using Umbraco.Cms.Core.Events; -using Umbraco.Cms.Core.Sync; - -namespace Umbraco.Cms.Core.Cache -{ - /// - /// Event args for cache refresher updates - /// - public abstract class CacheRefresherNotificationBase : INotification - { - public CacheRefresherNotificationBase Init(object msgObject, MessageType type) - { - MessageType = type; - MessageObject = msgObject; - - return this; - } - public object MessageObject { get; private set; } - public MessageType MessageType { get; private set;} - } - public class DataTypeCacheRefresherNotification : CacheRefresherNotificationBase - { - } - - public class UserCacheRefresherNotification : CacheRefresherNotificationBase - { - } - - - public class ContentCacheRefresherNotification : CacheRefresherNotificationBase - { - } - - public class TemplateCacheRefresherNotification : CacheRefresherNotificationBase - { - } - - public class RelationTypeCacheRefresherNotification : CacheRefresherNotificationBase - { - } - - public class PublicAccessCacheRefresherNotification : CacheRefresherNotificationBase - { - } - - public class MemberGroupCacheRefresherNotification : CacheRefresherNotificationBase - { - } - - public class MemberCacheRefresherNotification : CacheRefresherNotificationBase - { - } - - public class MediaCacheRefresherNotification : CacheRefresherNotificationBase - { - } - - public class UserGroupCacheRefresherNotification : CacheRefresherNotificationBase - { - } - - public class LanguageCacheRefresherNotification : CacheRefresherNotificationBase - { - } - public class MacroCacheRefresherNotification : CacheRefresherNotificationBase - { - } - - public class DomainCacheRefresherNotification : CacheRefresherNotificationBase - { - } - - public class ContentTypeCacheRefresherNotification : CacheRefresherNotificationBase - { - } - - public class ApplicationCacheRefresherNotification : CacheRefresherNotificationBase - { - } - public class DictionaryCacheRefresherNotification : CacheRefresherNotificationBase - { - } -} diff --git a/src/Umbraco.Core/Cache/CacheRefresherNotificationFactory.cs b/src/Umbraco.Core/Cache/CacheRefresherNotificationFactory.cs new file mode 100644 index 0000000000..9e4210cd2b --- /dev/null +++ b/src/Umbraco.Core/Cache/CacheRefresherNotificationFactory.cs @@ -0,0 +1,22 @@ +using System; +using Umbraco.Cms.Core.Sync; + +namespace Umbraco.Cms.Core.Cache +{ + /// + /// A that uses ActivatorUtilities to create the instances + /// + public sealed class CacheRefresherNotificationFactory : ICacheRefresherNotificationFactory + { + private readonly IServiceProvider _serviceProvider; + + public CacheRefresherNotificationFactory(IServiceProvider serviceProvider) => _serviceProvider = serviceProvider; + + /// + /// Create a using ActivatorUtilities + /// + /// The to create + public TNotification Create(object msgObject, MessageType type) where TNotification : CacheRefresherNotification + => _serviceProvider.CreateInstance(new object[] { msgObject, type }); + } +} diff --git a/src/Umbraco.Core/Cache/ContentCacheRefresher.cs b/src/Umbraco.Core/Cache/ContentCacheRefresher.cs index 42674d689b..26cf00a2d9 100644 --- a/src/Umbraco.Core/Cache/ContentCacheRefresher.cs +++ b/src/Umbraco.Core/Cache/ContentCacheRefresher.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; using System.Linq; using Umbraco.Cms.Core.Events; @@ -24,8 +24,9 @@ namespace Umbraco.Cms.Core.Cache IPublishedSnapshotService publishedSnapshotService, IIdKeyMap idKeyMap, IDomainService domainService, - IEventAggregator eventAggregator) - : base(appCaches, serializer, eventAggregator) + IEventAggregator eventAggregator, + ICacheRefresherNotificationFactory factory) + : base(appCaches, serializer, eventAggregator, factory) { _publishedSnapshotService = publishedSnapshotService; _idKeyMap = idKeyMap; diff --git a/src/Umbraco.Core/Cache/ContentCacheRefresherNotification.cs b/src/Umbraco.Core/Cache/ContentCacheRefresherNotification.cs new file mode 100644 index 0000000000..dd76786393 --- /dev/null +++ b/src/Umbraco.Core/Cache/ContentCacheRefresherNotification.cs @@ -0,0 +1,11 @@ +using Umbraco.Cms.Core.Sync; + +namespace Umbraco.Cms.Core.Cache +{ + public class ContentCacheRefresherNotification : CacheRefresherNotification + { + public ContentCacheRefresherNotification(object messageObject, MessageType messageType) : base(messageObject, messageType) + { + } + } +} diff --git a/src/Umbraco.Core/Cache/ContentTypeCacheRefresher.cs b/src/Umbraco.Core/Cache/ContentTypeCacheRefresher.cs index 00838865ce..b093df85b8 100644 --- a/src/Umbraco.Core/Cache/ContentTypeCacheRefresher.cs +++ b/src/Umbraco.Core/Cache/ContentTypeCacheRefresher.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Linq; using Umbraco.Cms.Core.Events; using Umbraco.Cms.Core.Models; @@ -26,8 +26,9 @@ namespace Umbraco.Cms.Core.Cache IPublishedModelFactory publishedModelFactory, IIdKeyMap idKeyMap, IContentTypeCommonRepository contentTypeCommonRepository, - IEventAggregator eventAggregator) - : base(appCaches, serializer, eventAggregator) + IEventAggregator eventAggregator, + ICacheRefresherNotificationFactory factory) + : base(appCaches, serializer, eventAggregator, factory) { _publishedSnapshotService = publishedSnapshotService; _publishedModelFactory = publishedModelFactory; diff --git a/src/Umbraco.Core/Cache/ContentTypeCacheRefresherNotification.cs b/src/Umbraco.Core/Cache/ContentTypeCacheRefresherNotification.cs new file mode 100644 index 0000000000..17bd955d03 --- /dev/null +++ b/src/Umbraco.Core/Cache/ContentTypeCacheRefresherNotification.cs @@ -0,0 +1,11 @@ +using Umbraco.Cms.Core.Sync; + +namespace Umbraco.Cms.Core.Cache +{ + public class ContentTypeCacheRefresherNotification : CacheRefresherNotification + { + public ContentTypeCacheRefresherNotification(object messageObject, MessageType messageType) : base(messageObject, messageType) + { + } + } +} diff --git a/src/Umbraco.Core/Cache/DataTypeCacheRefresher.cs b/src/Umbraco.Core/Cache/DataTypeCacheRefresher.cs index 0eca1a0c20..dfbf9230e2 100644 --- a/src/Umbraco.Core/Cache/DataTypeCacheRefresher.cs +++ b/src/Umbraco.Core/Cache/DataTypeCacheRefresher.cs @@ -1,4 +1,4 @@ -using System; +using System; using Umbraco.Cms.Core.Events; using Umbraco.Cms.Core.Models; using Umbraco.Cms.Core.Models.PublishedContent; @@ -22,8 +22,9 @@ namespace Umbraco.Cms.Core.Cache IPublishedSnapshotService publishedSnapshotService, IPublishedModelFactory publishedModelFactory, IIdKeyMap idKeyMap, - IEventAggregator eventAggregator) - : base(appCaches, serializer, eventAggregator) + IEventAggregator eventAggregator, + ICacheRefresherNotificationFactory factory) + : base(appCaches, serializer, eventAggregator, factory) { _publishedSnapshotService = publishedSnapshotService; _publishedModelFactory = publishedModelFactory; diff --git a/src/Umbraco.Core/Cache/DataTypeCacheRefresherNotification.cs b/src/Umbraco.Core/Cache/DataTypeCacheRefresherNotification.cs new file mode 100644 index 0000000000..d64dd53431 --- /dev/null +++ b/src/Umbraco.Core/Cache/DataTypeCacheRefresherNotification.cs @@ -0,0 +1,11 @@ +using Umbraco.Cms.Core.Sync; + +namespace Umbraco.Cms.Core.Cache +{ + public class DataTypeCacheRefresherNotification : CacheRefresherNotification + { + public DataTypeCacheRefresherNotification(object messageObject, MessageType messageType) : base(messageObject, messageType) + { + } + } +} diff --git a/src/Umbraco.Core/Cache/DictionaryCacheRefresher.cs b/src/Umbraco.Core/Cache/DictionaryCacheRefresher.cs index 8e21146a96..c812a4aadc 100644 --- a/src/Umbraco.Core/Cache/DictionaryCacheRefresher.cs +++ b/src/Umbraco.Core/Cache/DictionaryCacheRefresher.cs @@ -1,4 +1,4 @@ -using System; +using System; using Umbraco.Cms.Core.Events; using Umbraco.Cms.Core.Models; @@ -6,8 +6,8 @@ namespace Umbraco.Cms.Core.Cache { public sealed class DictionaryCacheRefresher : CacheRefresherBase { - public DictionaryCacheRefresher(AppCaches appCaches, IEventAggregator eventAggregator) - : base(appCaches, eventAggregator) + public DictionaryCacheRefresher(AppCaches appCaches, IEventAggregator eventAggregator, ICacheRefresherNotificationFactory factory) + : base(appCaches, eventAggregator , factory) { } #region Define diff --git a/src/Umbraco.Core/Cache/DictionaryCacheRefresherNotification.cs b/src/Umbraco.Core/Cache/DictionaryCacheRefresherNotification.cs new file mode 100644 index 0000000000..57474466d0 --- /dev/null +++ b/src/Umbraco.Core/Cache/DictionaryCacheRefresherNotification.cs @@ -0,0 +1,11 @@ +using Umbraco.Cms.Core.Sync; + +namespace Umbraco.Cms.Core.Cache +{ + public class DictionaryCacheRefresherNotification : CacheRefresherNotification + { + public DictionaryCacheRefresherNotification(object messageObject, MessageType messageType) : base(messageObject, messageType) + { + } + } +} diff --git a/src/Umbraco.Core/Cache/DomainCacheRefresher.cs b/src/Umbraco.Core/Cache/DomainCacheRefresher.cs index 098b200632..228baf4b9a 100644 --- a/src/Umbraco.Core/Cache/DomainCacheRefresher.cs +++ b/src/Umbraco.Core/Cache/DomainCacheRefresher.cs @@ -1,4 +1,4 @@ -using System; +using System; using Umbraco.Cms.Core.Events; using Umbraco.Cms.Core.Models; using Umbraco.Cms.Core.PublishedCache; @@ -15,8 +15,9 @@ namespace Umbraco.Cms.Core.Cache AppCaches appCaches, IJsonSerializer serializer, IPublishedSnapshotService publishedSnapshotService, - IEventAggregator eventAggregator) - : base(appCaches, serializer, eventAggregator) + IEventAggregator eventAggregator, + ICacheRefresherNotificationFactory factory) + : base(appCaches, serializer, eventAggregator, factory) { _publishedSnapshotService = publishedSnapshotService; } diff --git a/src/Umbraco.Core/Cache/DomainCacheRefresherNotification.cs b/src/Umbraco.Core/Cache/DomainCacheRefresherNotification.cs new file mode 100644 index 0000000000..53495ec6cc --- /dev/null +++ b/src/Umbraco.Core/Cache/DomainCacheRefresherNotification.cs @@ -0,0 +1,11 @@ +using Umbraco.Cms.Core.Sync; + +namespace Umbraco.Cms.Core.Cache +{ + public class DomainCacheRefresherNotification : CacheRefresherNotification + { + public DomainCacheRefresherNotification(object messageObject, MessageType messageType) : base(messageObject, messageType) + { + } + } +} diff --git a/src/Umbraco.Core/Cache/ICacheRefresherNotificationFactory.cs b/src/Umbraco.Core/Cache/ICacheRefresherNotificationFactory.cs new file mode 100644 index 0000000000..c79f7579a7 --- /dev/null +++ b/src/Umbraco.Core/Cache/ICacheRefresherNotificationFactory.cs @@ -0,0 +1,16 @@ +using Umbraco.Cms.Core.Sync; + +namespace Umbraco.Cms.Core.Cache +{ + /// + /// Factory for creating cache refresher notification instances + /// + public interface ICacheRefresherNotificationFactory + { + /// + /// Creates a + /// + /// The to create + TNotification Create(object msgObject, MessageType type) where TNotification : CacheRefresherNotification; + } +} diff --git a/src/Umbraco.Core/Cache/JsonCacheRefresherBase.cs b/src/Umbraco.Core/Cache/JsonCacheRefresherBase.cs index 4ad5842373..f0946e0e52 100644 --- a/src/Umbraco.Core/Cache/JsonCacheRefresherBase.cs +++ b/src/Umbraco.Core/Cache/JsonCacheRefresherBase.cs @@ -1,4 +1,4 @@ -using Umbraco.Cms.Core.Events; +using Umbraco.Cms.Core.Events; using Umbraco.Cms.Core.Serialization; using Umbraco.Cms.Core.Sync; @@ -10,7 +10,7 @@ namespace Umbraco.Cms.Core.Cache /// The actual cache refresher type. /// The actual cache refresher type is used for strongly typed events. public abstract class JsonCacheRefresherBase : CacheRefresherBase, IJsonCacheRefresher - where TNotification : CacheRefresherNotificationBase, new() + where TNotification : CacheRefresherNotification { protected IJsonSerializer JsonSerializer { get; } @@ -21,8 +21,9 @@ namespace Umbraco.Cms.Core.Cache protected JsonCacheRefresherBase( AppCaches appCaches, IJsonSerializer jsonSerializer, - IEventAggregator eventAggregator) - : base(appCaches, eventAggregator) + IEventAggregator eventAggregator, + ICacheRefresherNotificationFactory factory) + : base(appCaches, eventAggregator, factory) { JsonSerializer = jsonSerializer; } @@ -33,7 +34,7 @@ namespace Umbraco.Cms.Core.Cache /// The json payload. public virtual void Refresh(string json) { - OnCacheUpdated(new TNotification().Init(json, MessageType.RefreshByJson)); + OnCacheUpdated(NotificationFactory.Create(json, MessageType.RefreshByJson)); } #region Json diff --git a/src/Umbraco.Core/Cache/LanguageCacheRefresher.cs b/src/Umbraco.Core/Cache/LanguageCacheRefresher.cs index 1e9ff228df..fb65aaa58d 100644 --- a/src/Umbraco.Core/Cache/LanguageCacheRefresher.cs +++ b/src/Umbraco.Core/Cache/LanguageCacheRefresher.cs @@ -1,4 +1,4 @@ -using System; +using System; using Umbraco.Cms.Core.Events; using Umbraco.Cms.Core.Models; using Umbraco.Cms.Core.PublishedCache; @@ -14,8 +14,9 @@ namespace Umbraco.Cms.Core.Cache AppCaches appCaches, IJsonSerializer serializer, IPublishedSnapshotService publishedSnapshotService, - IEventAggregator eventAggregator) - : base(appCaches, serializer, eventAggregator) + IEventAggregator eventAggregator, + ICacheRefresherNotificationFactory factory) + : base(appCaches, serializer, eventAggregator, factory) { _publishedSnapshotService = publishedSnapshotService; } diff --git a/src/Umbraco.Core/Cache/LanguageCacheRefresherNotification.cs b/src/Umbraco.Core/Cache/LanguageCacheRefresherNotification.cs new file mode 100644 index 0000000000..fde0090c28 --- /dev/null +++ b/src/Umbraco.Core/Cache/LanguageCacheRefresherNotification.cs @@ -0,0 +1,11 @@ +using Umbraco.Cms.Core.Sync; + +namespace Umbraco.Cms.Core.Cache +{ + public class LanguageCacheRefresherNotification : CacheRefresherNotification + { + public LanguageCacheRefresherNotification(object messageObject, MessageType messageType) : base(messageObject, messageType) + { + } + } +} diff --git a/src/Umbraco.Core/Cache/MacroCacheRefresher.cs b/src/Umbraco.Core/Cache/MacroCacheRefresher.cs index 5e6c3294ab..fa4dca5ecc 100644 --- a/src/Umbraco.Core/Cache/MacroCacheRefresher.cs +++ b/src/Umbraco.Core/Cache/MacroCacheRefresher.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Linq; using Umbraco.Cms.Core.Events; using Umbraco.Cms.Core.Models; @@ -12,8 +12,9 @@ namespace Umbraco.Cms.Core.Cache public MacroCacheRefresher( AppCaches appCaches, IJsonSerializer jsonSerializer, - IEventAggregator eventAggregator) - : base(appCaches, jsonSerializer, eventAggregator) + IEventAggregator eventAggregator, + ICacheRefresherNotificationFactory factory) + : base(appCaches, jsonSerializer, eventAggregator, factory) { } diff --git a/src/Umbraco.Core/Cache/MacroCacheRefresherNotification.cs b/src/Umbraco.Core/Cache/MacroCacheRefresherNotification.cs new file mode 100644 index 0000000000..f5ca7985c8 --- /dev/null +++ b/src/Umbraco.Core/Cache/MacroCacheRefresherNotification.cs @@ -0,0 +1,11 @@ +using Umbraco.Cms.Core.Sync; + +namespace Umbraco.Cms.Core.Cache +{ + public class MacroCacheRefresherNotification : CacheRefresherNotification + { + public MacroCacheRefresherNotification(object messageObject, MessageType messageType) : base(messageObject, messageType) + { + } + } +} diff --git a/src/Umbraco.Core/Cache/MediaCacheRefresher.cs b/src/Umbraco.Core/Cache/MediaCacheRefresher.cs index a4f424acf2..a0101ab66c 100644 --- a/src/Umbraco.Core/Cache/MediaCacheRefresher.cs +++ b/src/Umbraco.Core/Cache/MediaCacheRefresher.cs @@ -1,4 +1,4 @@ -using System; +using System; using Umbraco.Cms.Core.Events; using Umbraco.Cms.Core.Models; using Umbraco.Cms.Core.Persistence.Repositories; @@ -15,8 +15,8 @@ namespace Umbraco.Cms.Core.Cache private readonly IPublishedSnapshotService _publishedSnapshotService; private readonly IIdKeyMap _idKeyMap; - public MediaCacheRefresher(AppCaches appCaches, IJsonSerializer serializer, IPublishedSnapshotService publishedSnapshotService, IIdKeyMap idKeyMap, IEventAggregator eventAggregator) - : base(appCaches, serializer, eventAggregator) + public MediaCacheRefresher(AppCaches appCaches, IJsonSerializer serializer, IPublishedSnapshotService publishedSnapshotService, IIdKeyMap idKeyMap, IEventAggregator eventAggregator, ICacheRefresherNotificationFactory factory) + : base(appCaches, serializer, eventAggregator, factory) { _publishedSnapshotService = publishedSnapshotService; _idKeyMap = idKeyMap; diff --git a/src/Umbraco.Core/Cache/MediaCacheRefresherNotification.cs b/src/Umbraco.Core/Cache/MediaCacheRefresherNotification.cs new file mode 100644 index 0000000000..afdd60bb4a --- /dev/null +++ b/src/Umbraco.Core/Cache/MediaCacheRefresherNotification.cs @@ -0,0 +1,11 @@ +using Umbraco.Cms.Core.Sync; + +namespace Umbraco.Cms.Core.Cache +{ + public class MediaCacheRefresherNotification : CacheRefresherNotification + { + public MediaCacheRefresherNotification(object messageObject, MessageType messageType) : base(messageObject, messageType) + { + } + } +} diff --git a/src/Umbraco.Core/Cache/MemberCacheRefresher.cs b/src/Umbraco.Core/Cache/MemberCacheRefresher.cs index 40f324384b..b416889363 100644 --- a/src/Umbraco.Core/Cache/MemberCacheRefresher.cs +++ b/src/Umbraco.Core/Cache/MemberCacheRefresher.cs @@ -14,8 +14,8 @@ namespace Umbraco.Cms.Core.Cache { private readonly IIdKeyMap _idKeyMap; - public MemberCacheRefresher(AppCaches appCaches, IJsonSerializer serializer, IIdKeyMap idKeyMap, IEventAggregator eventAggregator) - : base(appCaches, serializer, eventAggregator) + public MemberCacheRefresher(AppCaches appCaches, IJsonSerializer serializer, IIdKeyMap idKeyMap, IEventAggregator eventAggregator, ICacheRefresherNotificationFactory factory) + : base(appCaches, serializer, eventAggregator, factory) { _idKeyMap = idKeyMap; } diff --git a/src/Umbraco.Core/Cache/MemberCacheRefresherNotification.cs b/src/Umbraco.Core/Cache/MemberCacheRefresherNotification.cs new file mode 100644 index 0000000000..6154505947 --- /dev/null +++ b/src/Umbraco.Core/Cache/MemberCacheRefresherNotification.cs @@ -0,0 +1,11 @@ +using Umbraco.Cms.Core.Sync; + +namespace Umbraco.Cms.Core.Cache +{ + public class MemberCacheRefresherNotification : CacheRefresherNotification + { + public MemberCacheRefresherNotification(object messageObject, MessageType messageType) : base(messageObject, messageType) + { + } + } +} diff --git a/src/Umbraco.Core/Cache/MemberGroupCacheRefresher.cs b/src/Umbraco.Core/Cache/MemberGroupCacheRefresher.cs index 637d4c8558..1f019e8f30 100644 --- a/src/Umbraco.Core/Cache/MemberGroupCacheRefresher.cs +++ b/src/Umbraco.Core/Cache/MemberGroupCacheRefresher.cs @@ -1,4 +1,4 @@ -using System; +using System; using Umbraco.Cms.Core.Events; using Umbraco.Cms.Core.Models; using Umbraco.Cms.Core.Serialization; @@ -7,8 +7,8 @@ namespace Umbraco.Cms.Core.Cache { public sealed class MemberGroupCacheRefresher : PayloadCacheRefresherBase { - public MemberGroupCacheRefresher(AppCaches appCaches, IJsonSerializer jsonSerializer, IEventAggregator eventAggregator) - : base(appCaches, jsonSerializer, eventAggregator) + public MemberGroupCacheRefresher(AppCaches appCaches, IJsonSerializer jsonSerializer, IEventAggregator eventAggregator, ICacheRefresherNotificationFactory factory) + : base(appCaches, jsonSerializer, eventAggregator, factory) { } diff --git a/src/Umbraco.Core/Cache/MemberGroupCacheRefresherNotification.cs b/src/Umbraco.Core/Cache/MemberGroupCacheRefresherNotification.cs new file mode 100644 index 0000000000..643e9bd51e --- /dev/null +++ b/src/Umbraco.Core/Cache/MemberGroupCacheRefresherNotification.cs @@ -0,0 +1,11 @@ +using Umbraco.Cms.Core.Sync; + +namespace Umbraco.Cms.Core.Cache +{ + public class MemberGroupCacheRefresherNotification : CacheRefresherNotification + { + public MemberGroupCacheRefresherNotification(object messageObject, MessageType messageType) : base(messageObject, messageType) + { + } + } +} diff --git a/src/Umbraco.Core/Cache/PayloadCacheRefresherBase.cs b/src/Umbraco.Core/Cache/PayloadCacheRefresherBase.cs index dd11e899c0..f7867ae3fe 100644 --- a/src/Umbraco.Core/Cache/PayloadCacheRefresherBase.cs +++ b/src/Umbraco.Core/Cache/PayloadCacheRefresherBase.cs @@ -1,4 +1,4 @@ -using Umbraco.Cms.Core.Events; +using Umbraco.Cms.Core.Events; using Umbraco.Cms.Core.Serialization; using Umbraco.Cms.Core.Sync; @@ -11,8 +11,7 @@ namespace Umbraco.Cms.Core.Cache /// The payload type. /// The actual cache refresher type is used for strongly typed events. public abstract class PayloadCacheRefresherBase : JsonCacheRefresherBase, IPayloadCacheRefresher - where TNotification : CacheRefresherNotificationBase, new() - + where TNotification : CacheRefresherNotification { /// @@ -20,8 +19,8 @@ namespace Umbraco.Cms.Core.Cache /// /// A cache helper. /// - protected PayloadCacheRefresherBase(AppCaches appCaches, IJsonSerializer serializer, IEventAggregator eventAggregator) - : base(appCaches, serializer, eventAggregator) + protected PayloadCacheRefresherBase(AppCaches appCaches, IJsonSerializer serializer, IEventAggregator eventAggregator, ICacheRefresherNotificationFactory factory) + : base(appCaches, serializer, eventAggregator, factory) { } @@ -40,7 +39,7 @@ namespace Umbraco.Cms.Core.Cache /// The payload. public virtual void Refresh(TPayload[] payloads) { - OnCacheUpdated(new TNotification().Init(payloads, MessageType.RefreshByPayload)); + OnCacheUpdated(NotificationFactory.Create(payloads, MessageType.RefreshByPayload)); } #endregion diff --git a/src/Umbraco.Core/Cache/PublicAccessCacheRefresher.cs b/src/Umbraco.Core/Cache/PublicAccessCacheRefresher.cs index 44b108fa23..d833a0aea5 100644 --- a/src/Umbraco.Core/Cache/PublicAccessCacheRefresher.cs +++ b/src/Umbraco.Core/Cache/PublicAccessCacheRefresher.cs @@ -1,4 +1,4 @@ -using System; +using System; using Umbraco.Cms.Core.Events; using Umbraco.Cms.Core.Models; @@ -6,8 +6,8 @@ namespace Umbraco.Cms.Core.Cache { public sealed class PublicAccessCacheRefresher : CacheRefresherBase { - public PublicAccessCacheRefresher(AppCaches appCaches, IEventAggregator eventAggregator) - : base(appCaches, eventAggregator) + public PublicAccessCacheRefresher(AppCaches appCaches, IEventAggregator eventAggregator, ICacheRefresherNotificationFactory factory) + : base(appCaches, eventAggregator, factory) { } #region Define diff --git a/src/Umbraco.Core/Cache/PublicAccessCacheRefresherNotification.cs b/src/Umbraco.Core/Cache/PublicAccessCacheRefresherNotification.cs new file mode 100644 index 0000000000..d3334571b3 --- /dev/null +++ b/src/Umbraco.Core/Cache/PublicAccessCacheRefresherNotification.cs @@ -0,0 +1,11 @@ +using Umbraco.Cms.Core.Sync; + +namespace Umbraco.Cms.Core.Cache +{ + public class PublicAccessCacheRefresherNotification : CacheRefresherNotification + { + public PublicAccessCacheRefresherNotification(object messageObject, MessageType messageType) : base(messageObject, messageType) + { + } + } +} diff --git a/src/Umbraco.Core/Cache/RelationTypeCacheRefresher.cs b/src/Umbraco.Core/Cache/RelationTypeCacheRefresher.cs index d82cef759d..6f15d09554 100644 --- a/src/Umbraco.Core/Cache/RelationTypeCacheRefresher.cs +++ b/src/Umbraco.Core/Cache/RelationTypeCacheRefresher.cs @@ -1,4 +1,4 @@ -using System; +using System; using Umbraco.Cms.Core.Events; using Umbraco.Cms.Core.Models; using Umbraco.Cms.Core.Persistence.Repositories; @@ -7,8 +7,8 @@ namespace Umbraco.Cms.Core.Cache { public sealed class RelationTypeCacheRefresher : CacheRefresherBase { - public RelationTypeCacheRefresher(AppCaches appCaches, IEventAggregator eventAggregator) - : base(appCaches, eventAggregator) + public RelationTypeCacheRefresher(AppCaches appCaches, IEventAggregator eventAggregator, ICacheRefresherNotificationFactory factory) + : base(appCaches, eventAggregator, factory) { } #region Define diff --git a/src/Umbraco.Core/Cache/RelationTypeCacheRefresherNotification.cs b/src/Umbraco.Core/Cache/RelationTypeCacheRefresherNotification.cs new file mode 100644 index 0000000000..851eba915d --- /dev/null +++ b/src/Umbraco.Core/Cache/RelationTypeCacheRefresherNotification.cs @@ -0,0 +1,11 @@ +using Umbraco.Cms.Core.Sync; + +namespace Umbraco.Cms.Core.Cache +{ + public class RelationTypeCacheRefresherNotification : CacheRefresherNotification + { + public RelationTypeCacheRefresherNotification(object messageObject, MessageType messageType) : base(messageObject, messageType) + { + } + } +} diff --git a/src/Umbraco.Core/Cache/TemplateCacheRefresher.cs b/src/Umbraco.Core/Cache/TemplateCacheRefresher.cs index 6c33a44545..c098ccb967 100644 --- a/src/Umbraco.Core/Cache/TemplateCacheRefresher.cs +++ b/src/Umbraco.Core/Cache/TemplateCacheRefresher.cs @@ -1,4 +1,4 @@ -using System; +using System; using Umbraco.Cms.Core.Events; using Umbraco.Cms.Core.Models; using Umbraco.Cms.Core.Persistence.Repositories; @@ -11,8 +11,8 @@ namespace Umbraco.Cms.Core.Cache private readonly IIdKeyMap _idKeyMap; private readonly IContentTypeCommonRepository _contentTypeCommonRepository; - public TemplateCacheRefresher(AppCaches appCaches, IIdKeyMap idKeyMap, IContentTypeCommonRepository contentTypeCommonRepository, IEventAggregator eventAggregator) - : base(appCaches, eventAggregator) + public TemplateCacheRefresher(AppCaches appCaches, IIdKeyMap idKeyMap, IContentTypeCommonRepository contentTypeCommonRepository, IEventAggregator eventAggregator, ICacheRefresherNotificationFactory factory) + : base(appCaches, eventAggregator, factory) { _idKeyMap = idKeyMap; _contentTypeCommonRepository = contentTypeCommonRepository; diff --git a/src/Umbraco.Core/Cache/TemplateCacheRefresherNotification.cs b/src/Umbraco.Core/Cache/TemplateCacheRefresherNotification.cs new file mode 100644 index 0000000000..88ff2284cb --- /dev/null +++ b/src/Umbraco.Core/Cache/TemplateCacheRefresherNotification.cs @@ -0,0 +1,11 @@ +using Umbraco.Cms.Core.Sync; + +namespace Umbraco.Cms.Core.Cache +{ + public class TemplateCacheRefresherNotification : CacheRefresherNotification + { + public TemplateCacheRefresherNotification(object messageObject, MessageType messageType) : base(messageObject, messageType) + { + } + } +} diff --git a/src/Umbraco.Core/Cache/UserCacheRefresher.cs b/src/Umbraco.Core/Cache/UserCacheRefresher.cs index b8fd75702e..201ecc1f19 100644 --- a/src/Umbraco.Core/Cache/UserCacheRefresher.cs +++ b/src/Umbraco.Core/Cache/UserCacheRefresher.cs @@ -1,4 +1,4 @@ -using System; +using System; using Umbraco.Cms.Core.Events; using Umbraco.Cms.Core.Models.Membership; using Umbraco.Cms.Core.Persistence.Repositories; @@ -7,8 +7,8 @@ namespace Umbraco.Cms.Core.Cache { public sealed class UserCacheRefresher : CacheRefresherBase { - public UserCacheRefresher(AppCaches appCaches, IEventAggregator eventAggregator) - : base(appCaches, eventAggregator) + public UserCacheRefresher(AppCaches appCaches, IEventAggregator eventAggregator, ICacheRefresherNotificationFactory factory) + : base(appCaches, eventAggregator, factory) { } #region Define diff --git a/src/Umbraco.Core/Cache/UserCacheRefresherNotification.cs b/src/Umbraco.Core/Cache/UserCacheRefresherNotification.cs new file mode 100644 index 0000000000..b91a7b93c8 --- /dev/null +++ b/src/Umbraco.Core/Cache/UserCacheRefresherNotification.cs @@ -0,0 +1,11 @@ +using Umbraco.Cms.Core.Sync; + +namespace Umbraco.Cms.Core.Cache +{ + public class UserCacheRefresherNotification : CacheRefresherNotification + { + public UserCacheRefresherNotification(object messageObject, MessageType messageType) : base(messageObject, messageType) + { + } + } +} diff --git a/src/Umbraco.Core/Cache/UserGroupCacheRefresher.cs b/src/Umbraco.Core/Cache/UserGroupCacheRefresher.cs index f4456ef696..2d278972ec 100644 --- a/src/Umbraco.Core/Cache/UserGroupCacheRefresher.cs +++ b/src/Umbraco.Core/Cache/UserGroupCacheRefresher.cs @@ -1,4 +1,4 @@ -using System; +using System; using Umbraco.Cms.Core.Events; using Umbraco.Cms.Core.Models.Membership; using Umbraco.Cms.Core.Persistence.Repositories; @@ -13,8 +13,8 @@ namespace Umbraco.Cms.Core.Cache /// public sealed class UserGroupCacheRefresher : CacheRefresherBase { - public UserGroupCacheRefresher(AppCaches appCaches, IEventAggregator eventAggregator) - : base(appCaches, eventAggregator) + public UserGroupCacheRefresher(AppCaches appCaches, IEventAggregator eventAggregator, ICacheRefresherNotificationFactory factory) + : base(appCaches, eventAggregator, factory) { } #region Define diff --git a/src/Umbraco.Core/Cache/UserGroupCacheRefresherNotification.cs b/src/Umbraco.Core/Cache/UserGroupCacheRefresherNotification.cs new file mode 100644 index 0000000000..a0adf915d8 --- /dev/null +++ b/src/Umbraco.Core/Cache/UserGroupCacheRefresherNotification.cs @@ -0,0 +1,11 @@ +using Umbraco.Cms.Core.Sync; + +namespace Umbraco.Cms.Core.Cache +{ + public class UserGroupCacheRefresherNotification : CacheRefresherNotification + { + public UserGroupCacheRefresherNotification(object messageObject, MessageType messageType) : base(messageObject, messageType) + { + } + } +} diff --git a/src/Umbraco.Core/DependencyInjection/UmbracoBuilder.cs b/src/Umbraco.Core/DependencyInjection/UmbracoBuilder.cs index 5249676fb6..82cf6ffa84 100644 --- a/src/Umbraco.Core/DependencyInjection/UmbracoBuilder.cs +++ b/src/Umbraco.Core/DependencyInjection/UmbracoBuilder.cs @@ -189,6 +189,7 @@ namespace Umbraco.Cms.Core.DependencyInjection // register distributed cache Services.AddUnique(f => new DistributedCache(f.GetRequiredService(), f.GetRequiredService())); + Services.AddUnique(); // register the http context and umbraco context accessors // we *should* use the HttpContextUmbracoContextAccessor, however there are cases when From 4071df322afd67872fe11c411299b8c7a9dc822a Mon Sep 17 00:00:00 2001 From: Shannon Date: Mon, 15 Mar 2021 13:40:00 +1100 Subject: [PATCH 6/8] Adds missing null check on tagHelperOutput.TagName which can be null --- .../Views/UmbracoViewPage.cs | 40 +++++++++---------- 1 file changed, 19 insertions(+), 21 deletions(-) diff --git a/src/Umbraco.Web.Common/Views/UmbracoViewPage.cs b/src/Umbraco.Web.Common/Views/UmbracoViewPage.cs index 66d9b3c3f2..f8627dc2e9 100644 --- a/src/Umbraco.Web.Common/Views/UmbracoViewPage.cs +++ b/src/Umbraco.Web.Common/Views/UmbracoViewPage.cs @@ -118,31 +118,29 @@ namespace Umbraco.Cms.Web.Common.Views // ASP.NET default value is text/html if (Context.Response.ContentType.InvariantContains("text/html")) { - if (UmbracoContext.IsDebug || UmbracoContext.InPreviewMode) + if ((UmbracoContext.IsDebug || UmbracoContext.InPreviewMode) + && tagHelperOutput.TagName != null + && tagHelperOutput.TagName.Equals("body", StringComparison.InvariantCultureIgnoreCase)) { + string markupToInject; - if (tagHelperOutput.TagName.Equals("body", StringComparison.InvariantCultureIgnoreCase)) + if (UmbracoContext.InPreviewMode) { - string markupToInject; - - if (UmbracoContext.InPreviewMode) - { - // creating previewBadge markup - markupToInject = - string.Format( - ContentSettings.PreviewBadge, - IOHelper.ResolveUrl(GlobalSettings.UmbracoPath), - Context.Request.GetEncodedUrl(), - UmbracoContext.PublishedRequest.PublishedContent.Id); - } - else - { - // creating mini-profiler markup - markupToInject = ProfilerHtml.Render(); - } - - tagHelperOutput.Content.AppendHtml(markupToInject); + // creating previewBadge markup + markupToInject = + string.Format( + ContentSettings.PreviewBadge, + IOHelper.ResolveUrl(GlobalSettings.UmbracoPath), + Context.Request.GetEncodedUrl(), + UmbracoContext.PublishedRequest.PublishedContent.Id); } + else + { + // creating mini-profiler markup + markupToInject = ProfilerHtml.Render(); + } + + tagHelperOutput.Content.AppendHtml(markupToInject); } } } From db863b3250fd5604861c7c2039c2ddf06cdfb20e Mon Sep 17 00:00:00 2001 From: Shannon Date: Mon, 15 Mar 2021 13:45:09 +1100 Subject: [PATCH 7/8] missing namespace after file split. --- src/Umbraco.Core/Cache/CacheRefresherNotificationFactory.cs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/Umbraco.Core/Cache/CacheRefresherNotificationFactory.cs b/src/Umbraco.Core/Cache/CacheRefresherNotificationFactory.cs index 9e4210cd2b..fc9cdefe27 100644 --- a/src/Umbraco.Core/Cache/CacheRefresherNotificationFactory.cs +++ b/src/Umbraco.Core/Cache/CacheRefresherNotificationFactory.cs @@ -1,4 +1,5 @@ -using System; +using System; +using Umbraco.Extensions; using Umbraco.Cms.Core.Sync; namespace Umbraco.Cms.Core.Cache From 0374f6c2f547e4f828e5ce0f128491c19e59f46d Mon Sep 17 00:00:00 2001 From: Bjarke Berg Date: Mon, 15 Mar 2021 06:32:40 +0100 Subject: [PATCH 8/8] Update src/Umbraco.Web.Common/ModelsBuilder/DependencyInjection/UmbracoBuilderDependencyInjectionExtensions.cs Co-authored-by: Shannon Deminick --- .../UmbracoBuilderDependencyInjectionExtensions.cs | 1 - 1 file changed, 1 deletion(-) diff --git a/src/Umbraco.Web.Common/ModelsBuilder/DependencyInjection/UmbracoBuilderDependencyInjectionExtensions.cs b/src/Umbraco.Web.Common/ModelsBuilder/DependencyInjection/UmbracoBuilderDependencyInjectionExtensions.cs index e8b54d3af0..8762dc6cc3 100644 --- a/src/Umbraco.Web.Common/ModelsBuilder/DependencyInjection/UmbracoBuilderDependencyInjectionExtensions.cs +++ b/src/Umbraco.Web.Common/ModelsBuilder/DependencyInjection/UmbracoBuilderDependencyInjectionExtensions.cs @@ -111,7 +111,6 @@ namespace Umbraco.Extensions builder.Services.AddSingleton(); builder.AddNotificationHandler(); builder.AddNotificationHandler(); - builder.Services.AddSingleton(); builder.Services.AddSingleton(); builder.Services.AddSingleton();