diff --git a/src/Umbraco.Core/CoreBootManager.cs b/src/Umbraco.Core/CoreBootManager.cs index 36cda7ed75..fa542fffa3 100644 --- a/src/Umbraco.Core/CoreBootManager.cs +++ b/src/Umbraco.Core/CoreBootManager.cs @@ -433,9 +433,11 @@ namespace Umbraco.Core //by default we'll use the database server messenger with default options (no callbacks), // this will be overridden in the web startup - ServerMessengerResolver.Current = new ServerMessengerResolver( - Container, - factory => new DatabaseServerMessenger(ApplicationContext, true, new DatabaseServerMessengerOptions())); + // fixme - painful, have to take care of lifetime! - we CANNOT ask users to remember! + // fixme - same issue with PublishedContentModelFactory and many more, I guess! + Container.Register( + _ => new DatabaseServerMessenger(ApplicationContext, true, new DatabaseServerMessengerOptions()), + new PerContainerLifetime()); //RepositoryResolver.Current = new RepositoryResolver( // new RepositoryFactory(ApplicationCache)); diff --git a/src/Umbraco.Core/DependencyInjection/Current.cs b/src/Umbraco.Core/DependencyInjection/Current.cs index 6baa0aa06c..36dd25737a 100644 --- a/src/Umbraco.Core/DependencyInjection/Current.cs +++ b/src/Umbraco.Core/DependencyInjection/Current.cs @@ -4,6 +4,7 @@ using Umbraco.Core.Cache; using Umbraco.Core.Models.PublishedContent; using Umbraco.Core.PropertyEditors; using Umbraco.Core.Strings; +using Umbraco.Core.Sync; using Umbraco.Core._Legacy.PackageActions; namespace Umbraco.Core.DependencyInjection @@ -67,6 +68,9 @@ namespace Umbraco.Core.DependencyInjection internal static IPublishedContentModelFactory PublishedContentModelFactory => Container.GetInstance(); + public static IServerMessenger ServerMessenger + => Container.GetInstance(); + #endregion } } diff --git a/src/Umbraco.Core/Sync/ServerMessengerResolver.cs b/src/Umbraco.Core/Sync/ServerMessengerResolver.cs deleted file mode 100644 index 9f631c9a3b..0000000000 --- a/src/Umbraco.Core/Sync/ServerMessengerResolver.cs +++ /dev/null @@ -1,38 +0,0 @@ -using System; -using System.Linq.Expressions; -using LightInject; -using Umbraco.Core.ObjectResolution; - -namespace Umbraco.Core.Sync -{ - /// - /// Resolves the IServerMessenger object. - /// - public sealed class ServerMessengerResolver : ContainerSingleObjectResolver - { - internal ServerMessengerResolver(IServiceContainer container) - : base(container) - { } - - internal ServerMessengerResolver(IServiceContainer container, Func implementationType) - : base(container, implementationType) - { } - - /// - /// Sets the messenger. - /// - /// The messenger. - public void SetServerMessenger(IServerMessenger serverMessenger) - { - Value = serverMessenger; - } - - /// - /// Gets the messenger. - /// - public IServerMessenger Messenger - { - get { return Value; } - } - } -} \ No newline at end of file diff --git a/src/Umbraco.Core/Umbraco.Core.csproj b/src/Umbraco.Core/Umbraco.Core.csproj index a26b0e0b65..2bb844f238 100644 --- a/src/Umbraco.Core/Umbraco.Core.csproj +++ b/src/Umbraco.Core/Umbraco.Core.csproj @@ -1248,7 +1248,6 @@ - diff --git a/src/Umbraco.Tests/Cache/DistributedCache/DistributedCacheTests.cs b/src/Umbraco.Tests/Cache/DistributedCache/DistributedCacheTests.cs index ba6d75305e..c2d0ad9298 100644 --- a/src/Umbraco.Tests/Cache/DistributedCache/DistributedCacheTests.cs +++ b/src/Umbraco.Tests/Cache/DistributedCache/DistributedCacheTests.cs @@ -25,12 +25,13 @@ namespace Umbraco.Tests.Cache.DistributedCache var container = new ServiceContainer(); container.ConfigureUmbracoCore(); - ServerRegistrarResolver.Current = new ServerRegistrarResolver( - new TestServerRegistrar()); - ServerMessengerResolver.Current = new ServerMessengerResolver( - container, factory => new TestServerMessenger()); + ServerRegistrarResolver.Current = new ServerRegistrarResolver(new TestServerRegistrar()); + + container.Register(_ => new TestServerMessenger(), new PerContainerLifetime()); + CacheRefresherCollectionBuilder.Register(container) .Add(); + Resolution.Freeze(); } @@ -38,7 +39,6 @@ namespace Umbraco.Tests.Cache.DistributedCache public void Teardown() { ServerRegistrarResolver.Reset(); - ServerMessengerResolver.Reset(); Current.Reset(); } @@ -50,7 +50,7 @@ namespace Umbraco.Tests.Cache.DistributedCache { global::Umbraco.Web.Cache.DistributedCache.Instance.Refresh(Guid.Parse("E0F452CB-DCB2-4E84-B5A5-4F01744C5C73"), i); } - Assert.AreEqual(10, ((TestServerMessenger)ServerMessengerResolver.Current.Messenger).IntIdsRefreshed.Count); + Assert.AreEqual(10, ((TestServerMessenger)Current.ServerMessenger).IntIdsRefreshed.Count); } [Test] @@ -63,7 +63,7 @@ namespace Umbraco.Tests.Cache.DistributedCache x => x.Id, new TestObjectWithId{Id = i}); } - Assert.AreEqual(10, ((TestServerMessenger)ServerMessengerResolver.Current.Messenger).IntIdsRefreshed.Count); + Assert.AreEqual(10, ((TestServerMessenger)Current.ServerMessenger).IntIdsRefreshed.Count); } [Test] @@ -73,7 +73,7 @@ namespace Umbraco.Tests.Cache.DistributedCache { global::Umbraco.Web.Cache.DistributedCache.Instance.Refresh(Guid.Parse("E0F452CB-DCB2-4E84-B5A5-4F01744C5C73"), Guid.NewGuid()); } - Assert.AreEqual(11, ((TestServerMessenger)ServerMessengerResolver.Current.Messenger).GuidIdsRefreshed.Count); + Assert.AreEqual(11, ((TestServerMessenger)Current.ServerMessenger).GuidIdsRefreshed.Count); } [Test] @@ -83,7 +83,7 @@ namespace Umbraco.Tests.Cache.DistributedCache { global::Umbraco.Web.Cache.DistributedCache.Instance.Remove(Guid.Parse("E0F452CB-DCB2-4E84-B5A5-4F01744C5C73"), i); } - Assert.AreEqual(12, ((TestServerMessenger)ServerMessengerResolver.Current.Messenger).IntIdsRemoved.Count); + Assert.AreEqual(12, ((TestServerMessenger)Current.ServerMessenger).IntIdsRemoved.Count); } [Test] @@ -93,7 +93,7 @@ namespace Umbraco.Tests.Cache.DistributedCache { global::Umbraco.Web.Cache.DistributedCache.Instance.RefreshAll(Guid.Parse("E0F452CB-DCB2-4E84-B5A5-4F01744C5C73")); } - Assert.AreEqual(13, ((TestServerMessenger)ServerMessengerResolver.Current.Messenger).CountOfFullRefreshes); + Assert.AreEqual(13, ((TestServerMessenger)Current.ServerMessenger).CountOfFullRefreshes); } #region internal test classes diff --git a/src/Umbraco.Tests/Integration/ContentEventsTests.cs b/src/Umbraco.Tests/Integration/ContentEventsTests.cs index 7769a7b1c6..ca799da8de 100644 --- a/src/Umbraco.Tests/Integration/ContentEventsTests.cs +++ b/src/Umbraco.Tests/Integration/ContentEventsTests.cs @@ -1,6 +1,7 @@ using System; using System.Collections.Generic; using System.Linq; +using LightInject; using Moq; using NUnit.Framework; using Umbraco.Core; @@ -52,8 +53,9 @@ namespace Umbraco.Tests.Integration base.ConfigureContainer(); ServerRegistrarResolver.Current = new ServerRegistrarResolver(new DistributedCacheTests.TestServerRegistrar()); // localhost-only - ServerMessengerResolver.Current = new ServerMessengerResolver(Container); - Container.Register(); + + Container.Register(new PerContainerLifetime()); + CacheRefresherCollectionBuilder.Register(Container) .Add() .Add() diff --git a/src/Umbraco.Web/Cache/DistributedCache.cs b/src/Umbraco.Web/Cache/DistributedCache.cs index 9eba1f7f79..3e69a897a0 100644 --- a/src/Umbraco.Web/Cache/DistributedCache.cs +++ b/src/Umbraco.Web/Cache/DistributedCache.cs @@ -63,7 +63,7 @@ namespace Umbraco.Web.Cache { if (refresherGuid == Guid.Empty || instances.Length == 0 || getNumericId == null) return; - ServerMessengerResolver.Current.Messenger.PerformRefresh( + Current.ServerMessenger.PerformRefresh( ServerRegistrarResolver.Current.Registrar.Registrations, GetRefresherById(refresherGuid), getNumericId, @@ -79,7 +79,7 @@ namespace Umbraco.Web.Cache { if (refresherGuid == Guid.Empty || id == default(int)) return; - ServerMessengerResolver.Current.Messenger.PerformRefresh( + Current.ServerMessenger.PerformRefresh( ServerRegistrarResolver.Current.Registrar.Registrations, GetRefresherById(refresherGuid), id); @@ -94,7 +94,7 @@ namespace Umbraco.Web.Cache { if (refresherGuid == Guid.Empty || id == Guid.Empty) return; - ServerMessengerResolver.Current.Messenger.PerformRefresh( + Current.ServerMessenger.PerformRefresh( ServerRegistrarResolver.Current.Registrar.Registrations, GetRefresherById(refresherGuid), id); @@ -106,7 +106,7 @@ namespace Umbraco.Web.Cache { if (refresherGuid == Guid.Empty || payload == null) return; - ServerMessengerResolver.Current.Messenger.PerformRefresh( + Current.ServerMessenger.PerformRefresh( ServerRegistrarResolver.Current.Registrar.Registrations, GetRefresherById(refresherGuid), payload); @@ -118,7 +118,7 @@ namespace Umbraco.Web.Cache { if (refresherGuid == Guid.Empty || payloads == null) return; - ServerMessengerResolver.Current.Messenger.PerformRefresh( + Current.ServerMessenger.PerformRefresh( ServerRegistrarResolver.Current.Registrar.Registrations, GetRefresherById(refresherGuid), payloads.ToArray()); @@ -132,7 +132,7 @@ namespace Umbraco.Web.Cache { if (refresherGuid == Guid.Empty || jsonPayload.IsNullOrWhiteSpace()) return; - ServerMessengerResolver.Current.Messenger.PerformRefresh( + Current.ServerMessenger.PerformRefresh( ServerRegistrarResolver.Current.Registrar.Registrations, GetRefresherById(refresherGuid), jsonPayload); @@ -147,7 +147,7 @@ namespace Umbraco.Web.Cache //{ // if (refresherId == Guid.Empty || payload == null) return; - // ServerMessengerResolver.Current.Messenger.Notify( + // Current.ServerMessenger.Notify( // ServerRegistrarResolver.Current.Registrar.Registrations, // GetRefresherById(refresherId), // json); @@ -161,7 +161,7 @@ namespace Umbraco.Web.Cache { if (refresherGuid == Guid.Empty) return; - ServerMessengerResolver.Current.Messenger.PerformRefreshAll( + Current.ServerMessenger.PerformRefreshAll( ServerRegistrarResolver.Current.Registrar.Registrations, GetRefresherById(refresherGuid)); } @@ -175,7 +175,7 @@ namespace Umbraco.Web.Cache { if (refresherGuid == Guid.Empty || id == default(int)) return; - ServerMessengerResolver.Current.Messenger.PerformRemove( + Current.ServerMessenger.PerformRemove( ServerRegistrarResolver.Current.Registrar.Registrations, GetRefresherById(refresherGuid), id); @@ -193,7 +193,7 @@ namespace Umbraco.Web.Cache /// public void Remove(Guid refresherGuid, Func getNumericId, params T[] instances) { - ServerMessengerResolver.Current.Messenger.PerformRemove( + Current.ServerMessenger.PerformRemove( ServerRegistrarResolver.Current.Registrar.Registrations, GetRefresherById(refresherGuid), getNumericId, diff --git a/src/Umbraco.Web/Current.cs b/src/Umbraco.Web/Current.cs index de7d56435f..c3addff7e7 100644 --- a/src/Umbraco.Web/Current.cs +++ b/src/Umbraco.Web/Current.cs @@ -8,6 +8,7 @@ using Umbraco.Core.Models.PublishedContent; using Umbraco.Core.Persistence.Migrations; using Umbraco.Core.PropertyEditors; using Umbraco.Core.Strings; +using Umbraco.Core.Sync; using Umbraco.Core._Legacy.PackageActions; using Umbraco.Web.Editors; using Umbraco.Web.HealthCheck; @@ -221,6 +222,9 @@ namespace Umbraco.Web internal static IPublishedContentModelFactory PublishedContentModelFactory => Container.GetInstance(); + public static IServerMessenger ServerMessenger + => Container.GetInstance(); + #endregion } } diff --git a/src/Umbraco.Web/WebBootManager.cs b/src/Umbraco.Web/WebBootManager.cs index 62ed13dcff..696e959088 100644 --- a/src/Umbraco.Web/WebBootManager.cs +++ b/src/Umbraco.Web/WebBootManager.cs @@ -417,7 +417,7 @@ namespace Umbraco.Web if (UmbracoConfig.For.UmbracoSettings().DistributedCall.Enabled) { //set the legacy one by default - this maintains backwards compat - ServerMessengerResolver.Current.SetServerMessenger(new BatchedWebServiceServerMessenger(() => + Container.Register(_ => new BatchedWebServiceServerMessenger(() => { //we should not proceed to change this if the app/database is not configured since there will // be no user, plus we don't need to have server messages sent if this is the case. @@ -436,18 +436,18 @@ namespace Umbraco.Web } catch (Exception e) { - ProfilingLogger.Logger.Error("An error occurred trying to set the IServerMessenger during application startup", e); + ProfilingLogger.Logger.Error("An error occurred trying to set the IServerMessenger during application startup", e); return null; } } - ProfilingLogger.Logger.Warn("Could not initialize the DefaultServerMessenger, the application is not configured or the database is not configured"); + ProfilingLogger.Logger.Warn("Could not initialize the DefaultServerMessenger, the application is not configured or the database is not configured"); return null; - })); + }), new PerContainerLifetime()); } else { - ServerMessengerResolver.Current.SetServerMessenger(new BatchedDatabaseServerMessenger( + Container.Register(_ => new BatchedDatabaseServerMessenger( ApplicationContext, true, //Default options for web including the required callbacks to build caches @@ -475,7 +475,7 @@ namespace Umbraco.Web // indexes then they can adjust this logic themselves. () => RebuildIndexes(false) } - })); + }), new PerContainerLifetime()); } ActionCollectionBuilder.Register(Container)