diff --git a/src/Umbraco.Core/Components/AuditEventsComposer.cs b/src/Umbraco.Core/Components/AuditEventsComposer.cs index 2dfacd8208..692cb6c6dd 100644 --- a/src/Umbraco.Core/Components/AuditEventsComposer.cs +++ b/src/Umbraco.Core/Components/AuditEventsComposer.cs @@ -1,10 +1,5 @@ namespace Umbraco.Core.Components { - public sealed class AuditEventsComposer : ICoreComposer - { - public void Compose(Composition composition) - { - composition.Components().Append(); - } - } + public sealed class AuditEventsComposer : ComponentComposer, ICoreComposer + { } } diff --git a/src/Umbraco.Core/Components/ComponentComposer.cs b/src/Umbraco.Core/Components/ComponentComposer.cs new file mode 100644 index 0000000000..792790c42f --- /dev/null +++ b/src/Umbraco.Core/Components/ComponentComposer.cs @@ -0,0 +1,20 @@ +namespace Umbraco.Core.Components +{ + /// + /// Provides a base class for composers which compose a component. + /// + /// The type of the component + public abstract class ComponentComposer : IComposer + where TComponent : IComponent + { + /// + public virtual void Compose(Composition composition) + { + composition.Components().Append(); + } + + // note: thanks to this class, a component that does not compose anything can be + // registered with one line: + // public class MyComponentComposer : ComponentComposer { } + } +} diff --git a/src/Umbraco.Core/Components/ManifestWatcherComposer.cs b/src/Umbraco.Core/Components/ManifestWatcherComposer.cs index 6060a7c895..b08680156b 100644 --- a/src/Umbraco.Core/Components/ManifestWatcherComposer.cs +++ b/src/Umbraco.Core/Components/ManifestWatcherComposer.cs @@ -1,11 +1,6 @@ namespace Umbraco.Core.Components { [RuntimeLevel(MinLevel = RuntimeLevel.Run)] - public class ManifestWatcherComposer : ICoreComposer - { - public void Compose(Composition composition) - { - composition.Components().Append(); - } - } + public class ManifestWatcherComposer : ComponentComposer, ICoreComposer + { } } diff --git a/src/Umbraco.Core/Components/RelateOnCopyComposer.cs b/src/Umbraco.Core/Components/RelateOnCopyComposer.cs index edea63b5e5..f5e9423edd 100644 --- a/src/Umbraco.Core/Components/RelateOnCopyComposer.cs +++ b/src/Umbraco.Core/Components/RelateOnCopyComposer.cs @@ -1,11 +1,6 @@ namespace Umbraco.Core.Components { [RuntimeLevel(MinLevel = RuntimeLevel.Run)] - public sealed class RelateOnCopyComposer : ICoreComposer - { - public void Compose(Composition composition) - { - composition.Components().Append(); - } - } -} \ No newline at end of file + public sealed class RelateOnCopyComposer : ComponentComposer, ICoreComposer + { } +} diff --git a/src/Umbraco.Core/Components/RelateOnTrashComposer.cs b/src/Umbraco.Core/Components/RelateOnTrashComposer.cs index d8d7d9e9f4..5d89bc0e37 100644 --- a/src/Umbraco.Core/Components/RelateOnTrashComposer.cs +++ b/src/Umbraco.Core/Components/RelateOnTrashComposer.cs @@ -1,11 +1,6 @@ namespace Umbraco.Core.Components { [RuntimeLevel(MinLevel = RuntimeLevel.Run)] - public sealed class RelateOnTrashComposer : ICoreComposer - { - public void Compose(Composition composition) - { - composition.Components().Append(); - } - } -} \ No newline at end of file + public sealed class RelateOnTrashComposer : ComponentComposer, ICoreComposer + { } +} diff --git a/src/Umbraco.Core/Runtime/CoreRuntimeComposer.cs b/src/Umbraco.Core/Runtime/CoreRuntimeComposer.cs index de0fae98f9..3d959f5263 100644 --- a/src/Umbraco.Core/Runtime/CoreRuntimeComposer.cs +++ b/src/Umbraco.Core/Runtime/CoreRuntimeComposer.cs @@ -24,11 +24,11 @@ using IntegerValidator = Umbraco.Core.PropertyEditors.Validators.IntegerValidato namespace Umbraco.Core.Runtime { - public class CoreRuntimeComposer : IRuntimeComposer + public class CoreRuntimeComposer : ComponentComposer, IRuntimeComposer { - public void Compose(Composition composition) + public override void Compose(Composition composition) { - composition.Components().Append(); + base.Compose(composition); // composers composition diff --git a/src/Umbraco.Web/Cache/DistributedCacheBinderComposer.cs b/src/Umbraco.Web/Cache/DistributedCacheBinderComposer.cs index 80b673434e..f0f57a203b 100644 --- a/src/Umbraco.Web/Cache/DistributedCacheBinderComposer.cs +++ b/src/Umbraco.Web/Cache/DistributedCacheBinderComposer.cs @@ -9,12 +9,13 @@ namespace Umbraco.Web.Cache /// [RuntimeLevel(MinLevel = RuntimeLevel.Run)] [ComposeBefore(typeof(ICoreComposer))] // runs before every other IUmbracoCoreComponent! - public sealed class DistributedCacheBinderComposer : ICoreComposer + public sealed class DistributedCacheBinderComposer : ComponentComposer, ICoreComposer { - public void Compose(Composition composition) + public override void Compose(Composition composition) { + base.Compose(composition); + composition.RegisterUnique(); - composition.Components().Append(); } } -} \ No newline at end of file +} diff --git a/src/Umbraco.Web/Components/BackOfficeUserAuditEventsComposer.cs b/src/Umbraco.Web/Components/BackOfficeUserAuditEventsComposer.cs index 021eba799b..8364dc05f4 100644 --- a/src/Umbraco.Web/Components/BackOfficeUserAuditEventsComposer.cs +++ b/src/Umbraco.Web/Components/BackOfficeUserAuditEventsComposer.cs @@ -2,11 +2,6 @@ namespace Umbraco.Web.Components { - public sealed class BackOfficeUserAuditEventsComposer : ICoreComposer - { - public void Compose(Composition composition) - { - composition.Components().Append(); - } - } + public sealed class BackOfficeUserAuditEventsComposer : ComponentComposer, ICoreComposer + { } } diff --git a/src/Umbraco.Web/Components/DatabaseServerRegistrarAndMessengerComponent.cs b/src/Umbraco.Web/Components/DatabaseServerRegistrarAndMessengerComponent.cs index e31d31608e..bd3b50bd9a 100644 --- a/src/Umbraco.Web/Components/DatabaseServerRegistrarAndMessengerComponent.cs +++ b/src/Umbraco.Web/Components/DatabaseServerRegistrarAndMessengerComponent.cs @@ -37,11 +37,11 @@ namespace Umbraco.Web.Components // todo - should not be a strong dependency on "examine" but on an "indexing component" [ComposeAfter(typeof(ExamineComposer))] - public sealed class DatabaseServerRegistrarAndMessengerComposer : ICoreComposer + public sealed class DatabaseServerRegistrarAndMessengerComposer : ComponentComposer, ICoreComposer { - public void Compose(Composition composition) + public override void Compose(Composition composition) { - composition.Components().Append(); + base.Compose(composition); composition.SetServerMessenger(factory => { diff --git a/src/Umbraco.Web/Components/NotificationsComposer.cs b/src/Umbraco.Web/Components/NotificationsComposer.cs index d1830323dd..c945facfc6 100644 --- a/src/Umbraco.Web/Components/NotificationsComposer.cs +++ b/src/Umbraco.Web/Components/NotificationsComposer.cs @@ -5,11 +5,12 @@ using Umbraco.Core.Composing; namespace Umbraco.Web.Components { [RuntimeLevel(MinLevel = RuntimeLevel.Run)] - public sealed class NotificationsComposer : ICoreComposer + public sealed class NotificationsComposer : ComponentComposer, ICoreComposer { - public void Compose(Composition composition) + public override void Compose(Composition composition) { - composition.Components().Append(); + base.Compose(composition); + composition.RegisterUnique(); } } diff --git a/src/Umbraco.Web/Components/PublicAccessComposer.cs b/src/Umbraco.Web/Components/PublicAccessComposer.cs index 4229df933c..a4ae98d0e9 100644 --- a/src/Umbraco.Web/Components/PublicAccessComposer.cs +++ b/src/Umbraco.Web/Components/PublicAccessComposer.cs @@ -7,11 +7,6 @@ namespace Umbraco.Web.Components /// Used to ensure that the public access data file is kept up to date properly /// [RuntimeLevel(MinLevel = RuntimeLevel.Run)] - public sealed class PublicAccessComposer : ICoreComposer - { - public void Compose(Composition composition) - { - composition.Components().Append(); - } - } -} \ No newline at end of file + public sealed class PublicAccessComposer : ComponentComposer, ICoreComposer + { } +} diff --git a/src/Umbraco.Web/Logging/WebProfilerComposer.cs b/src/Umbraco.Web/Logging/WebProfilerComposer.cs index 81a099167b..383d8d1149 100644 --- a/src/Umbraco.Web/Logging/WebProfilerComposer.cs +++ b/src/Umbraco.Web/Logging/WebProfilerComposer.cs @@ -2,11 +2,6 @@ namespace Umbraco.Web.Logging { - internal class WebProfilerComposer : ICoreComposer - { - public void Compose(Composition composition) - { - composition.Components().Append(); - } - } -} \ No newline at end of file + internal class WebProfilerComposer : ComponentComposer, ICoreComposer + { } +} diff --git a/src/Umbraco.Web/PropertyEditors/PropertyEditorsComposer.cs b/src/Umbraco.Web/PropertyEditors/PropertyEditorsComposer.cs index cfa8bacd77..1a1c218db6 100644 --- a/src/Umbraco.Web/PropertyEditors/PropertyEditorsComposer.cs +++ b/src/Umbraco.Web/PropertyEditors/PropertyEditorsComposer.cs @@ -4,11 +4,6 @@ using Umbraco.Core.Components; namespace Umbraco.Web.PropertyEditors { [RuntimeLevel(MinLevel = RuntimeLevel.Run)] - internal class PropertyEditorsComposer : ICoreComposer - { - public void Compose(Composition composition) - { - composition.Components().Append(); - } - } + internal class PropertyEditorsComposer : ComponentComposer, ICoreComposer + { } } diff --git a/src/Umbraco.Web/PublishedCache/NuCache/NuCacheComposer.cs b/src/Umbraco.Web/PublishedCache/NuCache/NuCacheComposer.cs index 0bef9b9fc4..0423084285 100644 --- a/src/Umbraco.Web/PublishedCache/NuCache/NuCacheComposer.cs +++ b/src/Umbraco.Web/PublishedCache/NuCache/NuCacheComposer.cs @@ -4,10 +4,12 @@ using Umbraco.Web.PublishedCache.NuCache.DataSource; namespace Umbraco.Web.PublishedCache.NuCache { - public class NuCacheComposer : ICoreComposer + public class NuCacheComposer : ComponentComposer, ICoreComposer { - public void Compose(Composition composition) + public override void Compose(Composition composition) { + base.Compose(composition); + // register the NuCache database data source composition.Register(); @@ -19,8 +21,6 @@ namespace Umbraco.Web.PublishedCache.NuCache // add the NuCache health check (hidden from type finder) // todo - no NuCache health check yet //composition.HealthChecks().Add(); - - composition.Components().Append(); } } -} \ No newline at end of file +} diff --git a/src/Umbraco.Web/Routing/RedirectTrackingComposer.cs b/src/Umbraco.Web/Routing/RedirectTrackingComposer.cs index f95ce63ac5..dabf1c15c3 100644 --- a/src/Umbraco.Web/Routing/RedirectTrackingComposer.cs +++ b/src/Umbraco.Web/Routing/RedirectTrackingComposer.cs @@ -12,11 +12,6 @@ namespace Umbraco.Web.Redirects /// recycle bin = moving to and from does nothing: to = the node is gone, where would we redirect? from = same /// [RuntimeLevel(MinLevel = RuntimeLevel.Run)] - public class RedirectTrackingComposer : ICoreComposer - { - public void Compose(Composition composition) - { - composition.Components().Append(); - } - } + public class RedirectTrackingComposer : ComponentComposer, ICoreComposer + { } } diff --git a/src/Umbraco.Web/Runtime/WebRuntimeComposer.cs b/src/Umbraco.Web/Runtime/WebRuntimeComposer.cs index 3e3f45b2a4..f7ae17e02e 100644 --- a/src/Umbraco.Web/Runtime/WebRuntimeComposer.cs +++ b/src/Umbraco.Web/Runtime/WebRuntimeComposer.cs @@ -36,11 +36,11 @@ using Current = Umbraco.Web.Composing.Current; namespace Umbraco.Web.Runtime { [ComposeAfter(typeof(CoreRuntimeComposer))] - public sealed class WebRuntimeComposer : IRuntimeComposer + public sealed class WebRuntimeComposer : ComponentComposer, IRuntimeComposer { - public void Compose(Composition composition) + public override void Compose(Composition composition) { - composition.Components().Append(); + base.Compose(composition); composition.Register(); diff --git a/src/Umbraco.Web/Scheduling/SchedulerComposer.cs b/src/Umbraco.Web/Scheduling/SchedulerComposer.cs index 5496531709..b28312c8d6 100644 --- a/src/Umbraco.Web/Scheduling/SchedulerComposer.cs +++ b/src/Umbraco.Web/Scheduling/SchedulerComposer.cs @@ -12,11 +12,6 @@ namespace Umbraco.Web.Scheduling /// the task correctly instead of killing it completely when the app domain shuts down. /// [RuntimeLevel(MinLevel = RuntimeLevel.Run)] - internal sealed class SchedulerComposer : ICoreComposer - { - public void Compose(Composition composition) - { - composition.Components().Append(); - } - } + internal sealed class SchedulerComposer : ComponentComposer, ICoreComposer + { } } diff --git a/src/Umbraco.Web/Search/ExamineComposer.cs b/src/Umbraco.Web/Search/ExamineComposer.cs index e7457c066d..ced169e6dc 100644 --- a/src/Umbraco.Web/Search/ExamineComposer.cs +++ b/src/Umbraco.Web/Search/ExamineComposer.cs @@ -15,10 +15,12 @@ namespace Umbraco.Web.Search /// Configures and installs Examine. /// [RuntimeLevel(MinLevel = RuntimeLevel.Run)] - public sealed class ExamineComposer : ICoreComposer + public sealed class ExamineComposer : ComponentComposer, ICoreComposer { - public void Compose(Composition composition) + public override void Compose(Composition composition) { + base.Compose(composition); + // populators are not a collection: once cannot remove ours, and can only add more // the container can inject IEnumerable and get them all composition.Register(Lifetime.Singleton); @@ -47,8 +49,6 @@ namespace Umbraco.Web.Search //and then we'll use MainDom to control Examine's shutdown - this MUST be done in Compose ie before ExamineManager //is instantiated, as the value is used during instantiation ExamineManager.DisableDefaultHostingEnvironmentRegistration(); - - composition.Components().Append(); } } -} \ No newline at end of file +} diff --git a/src/Umbraco.Web/SignalR/PreviewHubComposer.cs b/src/Umbraco.Web/SignalR/PreviewHubComposer.cs index 96988c4ee4..b92c6fe5a4 100644 --- a/src/Umbraco.Web/SignalR/PreviewHubComposer.cs +++ b/src/Umbraco.Web/SignalR/PreviewHubComposer.cs @@ -5,11 +5,12 @@ using Umbraco.Core.Components; namespace Umbraco.Web.SignalR { [RuntimeLevel(MinLevel = RuntimeLevel.Run)] - public class PreviewHubComposer : ICoreComposer + public class PreviewHubComposer : ComponentComposer, ICoreComposer { - public void Compose(Composition composition) + public override void Compose(Composition composition) { - composition.Components().Append(); + base.Compose(composition); + composition.RegisterUnique(_ => GlobalHost.ConnectionManager.GetHubContext()); } }