From 1198191e051fd40891177ee30ffe8e9d33a3c856 Mon Sep 17 00:00:00 2001 From: Lars-Erik Aabech Date: Sun, 9 Sep 2018 16:41:28 +0200 Subject: [PATCH] Wrapping server messenger factory to avoid re-registering for now. --- .../Components/CompositionExtensions.cs | 43 +++++++++++++------ .../Runtime/CoreRuntimeComponent.cs | 3 +- 2 files changed, 33 insertions(+), 13 deletions(-) diff --git a/src/Umbraco.Core/Components/CompositionExtensions.cs b/src/Umbraco.Core/Components/CompositionExtensions.cs index abc0fa3862..1bbb3faff0 100644 --- a/src/Umbraco.Core/Components/CompositionExtensions.cs +++ b/src/Umbraco.Core/Components/CompositionExtensions.cs @@ -172,16 +172,23 @@ namespace Umbraco.Core.Components composition.Container.RegisterSingleton(_ => registrar); } - /// - /// Sets the server messenger. - /// - /// The type of the server registrar. - /// The composition. - public static void SetServerMessenger(this Composition composition) - where T : IServerMessenger - { - composition.Container.Register(Lifetime.Singleton); - } + + // review since only one is called in the core for now, I remove this + // it allows us to wrap the factory to "allow re-registration". + ///// + ///// Sets the server messenger. + ///// + ///// The type of the server registrar. + ///// The composition. + //public static void SetServerMessenger(this Composition composition) + // where T : IServerMessenger + //{ + // composition.Container.Register(Lifetime.Singleton); + //} + + private static Func serverMessengerFactory = null; + private static bool serverMessengerIsRegistered = false; + private static Func wrappedServerMessengerFactory = c => serverMessengerFactory(c); /// /// Sets the server messenger. @@ -190,7 +197,13 @@ namespace Umbraco.Core.Components /// A function creating a server messenger. public static void SetServerMessenger(this Composition composition, Func factory) { - composition.Container.RegisterSingleton(factory); + if (!serverMessengerIsRegistered) + { + serverMessengerIsRegistered = true; + composition.Container.RegisterSingleton(wrappedServerMessengerFactory); + } + + serverMessengerFactory = factory; } /// @@ -200,7 +213,13 @@ namespace Umbraco.Core.Components /// A server messenger. public static void SetServerMessenger(this Composition composition, IServerMessenger registrar) { - composition.Container.RegisterSingleton(_ => registrar); + if (!serverMessengerIsRegistered) + { + serverMessengerIsRegistered = true; + composition.Container.RegisterSingleton(wrappedServerMessengerFactory); + } + + serverMessengerFactory = c => registrar; } /// diff --git a/src/Umbraco.Core/Runtime/CoreRuntimeComponent.cs b/src/Umbraco.Core/Runtime/CoreRuntimeComponent.cs index 9d7c3e5a6a..ae9955706c 100644 --- a/src/Umbraco.Core/Runtime/CoreRuntimeComponent.cs +++ b/src/Umbraco.Core/Runtime/CoreRuntimeComponent.cs @@ -74,7 +74,8 @@ namespace Umbraco.Core.Runtime // by default we'll use the database server messenger with default options (no callbacks), // this will be overridden by either the legacy thing or the db thing in the corresponding // components in the web project - fixme - should obsolete the legacy thing - composition.Container.RegisterSingleton(factory + composition.SetServerMessenger( + factory => new DatabaseServerMessenger( factory.GetInstance(), factory.GetInstance(),