diff --git a/src/Umbraco.Core/Cache/CacheRefresherCollection.cs b/src/Umbraco.Core/Cache/CacheRefresherCollection.cs new file mode 100644 index 0000000000..aedce683b4 --- /dev/null +++ b/src/Umbraco.Core/Cache/CacheRefresherCollection.cs @@ -0,0 +1,17 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using Umbraco.Core.DependencyInjection; + +namespace Umbraco.Core.Cache +{ + public class CacheRefresherCollection : BuilderCollectionBase + { + public CacheRefresherCollection(IEnumerable items) + : base(items) + { } + + public ICacheRefresher this[Guid id] + => this.FirstOrDefault(x => x.RefresherUniqueId == id); + } +} diff --git a/src/Umbraco.Core/Cache/CacheRefresherCollectionBuilder.cs b/src/Umbraco.Core/Cache/CacheRefresherCollectionBuilder.cs new file mode 100644 index 0000000000..7ffa609cd6 --- /dev/null +++ b/src/Umbraco.Core/Cache/CacheRefresherCollectionBuilder.cs @@ -0,0 +1,15 @@ +using System.Collections.Generic; +using LightInject; +using Umbraco.Core.DependencyInjection; + +namespace Umbraco.Core.Cache +{ + public class CacheRefresherCollectionBuilder : LazyCollectionBuilderBase + { + public CacheRefresherCollectionBuilder(IServiceContainer container) + : base(container) + { } + + protected override CacheRefresherCollectionBuilder This => this; + } +} diff --git a/src/Umbraco.Core/Cache/CacheRefreshersResolver.cs b/src/Umbraco.Core/Cache/CacheRefreshersResolver.cs deleted file mode 100644 index 1c2cff208f..0000000000 --- a/src/Umbraco.Core/Cache/CacheRefreshersResolver.cs +++ /dev/null @@ -1,45 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using LightInject; -using Umbraco.Core.Logging; -using Umbraco.Core.ObjectResolution; - -namespace Umbraco.Core.Cache -{ - - - /// - /// A resolver to return all ICacheRefresher objects - /// - internal sealed class CacheRefreshersResolver : ContainerLazyManyObjectsResolver - { - /// - /// Constructor - /// - /// - /// - /// - internal CacheRefreshersResolver(IServiceContainer serviceContainer, ILogger logger, Func> refreshers) - : base(serviceContainer, logger, refreshers) - { - - } - - /// - /// Gets the implementations. - /// - public IEnumerable CacheRefreshers => Values; - - /// - /// Returns an instance for the type identified by its unique type identifier. - /// - /// The type identifier. - /// The value of the type uniquely identified by . - public ICacheRefresher GetById(Guid id) - { - return Values.FirstOrDefault(x => x.RefresherUniqueId == id); - } - - } -} diff --git a/src/Umbraco.Core/CoreBootManager.cs b/src/Umbraco.Core/CoreBootManager.cs index ce54c8ef03..615182ccb1 100644 --- a/src/Umbraco.Core/CoreBootManager.cs +++ b/src/Umbraco.Core/CoreBootManager.cs @@ -449,9 +449,8 @@ namespace Umbraco.Core //RepositoryResolver.Current = new RepositoryResolver( // new RepositoryFactory(ApplicationCache)); - CacheRefreshersResolver.Current = new CacheRefreshersResolver( - Container, ProfilingLogger.Logger, - () => PluginManager.ResolveCacheRefreshers()); + CacheRefresherCollectionBuilder.Register(Container) + .AddProducer(() => PluginManager.ResolveCacheRefreshers()); PackageActionsResolver.Current = new PackageActionsResolver( ServiceProvider, ProfilingLogger.Logger, diff --git a/src/Umbraco.Core/DependencyInjection/Current.cs b/src/Umbraco.Core/DependencyInjection/Current.cs index 7d1c0ccc68..dd01bcdc12 100644 --- a/src/Umbraco.Core/DependencyInjection/Current.cs +++ b/src/Umbraco.Core/DependencyInjection/Current.cs @@ -1,5 +1,6 @@ using System; using LightInject; +using Umbraco.Core.Cache; using Umbraco.Core.Strings; namespace Umbraco.Core.DependencyInjection @@ -42,6 +43,9 @@ namespace Umbraco.Core.DependencyInjection public static UrlSegmentProviderCollection UrlSegmentProviders => Container.GetInstance(); + public static CacheRefresherCollection CacheRefreshers + => Container.GetInstance(); + #endregion } } diff --git a/src/Umbraco.Core/Sync/DatabaseServerMessenger.cs b/src/Umbraco.Core/Sync/DatabaseServerMessenger.cs index bf3eb23b98..46c5aa3681 100644 --- a/src/Umbraco.Core/Sync/DatabaseServerMessenger.cs +++ b/src/Umbraco.Core/Sync/DatabaseServerMessenger.cs @@ -10,6 +10,7 @@ using Newtonsoft.Json; using Newtonsoft.Json.Linq; using NPoco; using Umbraco.Core.Cache; +using Umbraco.Core.DependencyInjection; using Umbraco.Core.IO; using Umbraco.Core.Logging; using Umbraco.Core.Models.Rdbms; @@ -440,7 +441,7 @@ namespace Umbraco.Core.Sync private static ICacheRefresher GetRefresher(Guid id) { - var refresher = CacheRefreshersResolver.Current.GetById(id); + var refresher = Current.CacheRefreshers[id]; if (refresher == null) throw new InvalidOperationException("Cache refresher with ID \"" + id + "\" does not exist."); return refresher; diff --git a/src/Umbraco.Core/Umbraco.Core.csproj b/src/Umbraco.Core/Umbraco.Core.csproj index 1c8ebcd5f2..0ffa875de1 100644 --- a/src/Umbraco.Core/Umbraco.Core.csproj +++ b/src/Umbraco.Core/Umbraco.Core.csproj @@ -74,6 +74,8 @@ + + @@ -1116,7 +1118,6 @@ - diff --git a/src/Umbraco.Tests/Cache/DistributedCache/DistributedCacheTests.cs b/src/Umbraco.Tests/Cache/DistributedCache/DistributedCacheTests.cs index 6e3acfec35..41c8a92cba 100644 --- a/src/Umbraco.Tests/Cache/DistributedCache/DistributedCacheTests.cs +++ b/src/Umbraco.Tests/Cache/DistributedCache/DistributedCacheTests.cs @@ -6,6 +6,7 @@ using Moq; using NUnit.Framework; using Umbraco.Core; using Umbraco.Core.Cache; +using Umbraco.Core.DependencyInjection; using Umbraco.Core.Logging; using Umbraco.Core.ObjectResolution; using Umbraco.Core.Sync; @@ -28,8 +29,8 @@ namespace Umbraco.Tests.Cache.DistributedCache new TestServerRegistrar()); ServerMessengerResolver.Current = new ServerMessengerResolver( container, factory => new TestServerMessenger()); - CacheRefreshersResolver.Current = new CacheRefreshersResolver( - container, Mock.Of(), () => new[] { typeof(TestCacheRefresher) }); + CacheRefresherCollectionBuilder.Register(container) + .Add(); Resolution.Freeze(); } @@ -38,7 +39,6 @@ namespace Umbraco.Tests.Cache.DistributedCache { ServerRegistrarResolver.Reset(); ServerMessengerResolver.Reset(); - CacheRefreshersResolver.Reset(); } [Test] diff --git a/src/Umbraco.Tests/Integration/ContentEventsTests.cs b/src/Umbraco.Tests/Integration/ContentEventsTests.cs index c695f3dedf..7769a7b1c6 100644 --- a/src/Umbraco.Tests/Integration/ContentEventsTests.cs +++ b/src/Umbraco.Tests/Integration/ContentEventsTests.cs @@ -5,6 +5,7 @@ using Moq; using NUnit.Framework; using Umbraco.Core; using Umbraco.Core.Cache; +using Umbraco.Core.DependencyInjection; using Umbraco.Core.Logging; using Umbraco.Core.Models; using Umbraco.Core.Persistence.Repositories; @@ -53,13 +54,10 @@ namespace Umbraco.Tests.Integration ServerRegistrarResolver.Current = new ServerRegistrarResolver(new DistributedCacheTests.TestServerRegistrar()); // localhost-only ServerMessengerResolver.Current = new ServerMessengerResolver(Container); Container.Register(); - CacheRefreshersResolver.Current = new CacheRefreshersResolver(Container, Mock.Of(), () => new[] - { - typeof(ContentTypeCacheRefresher), - typeof(ContentCacheRefresher), - typeof(MacroCacheRefresher) - }); - + CacheRefresherCollectionBuilder.Register(Container) + .Add() + .Add() + .Add(); } public override void TearDown() diff --git a/src/Umbraco.Web/Cache/DistributedCache.cs b/src/Umbraco.Web/Cache/DistributedCache.cs index 5d7e50c01b..9eba1f7f79 100644 --- a/src/Umbraco.Web/Cache/DistributedCache.cs +++ b/src/Umbraco.Web/Cache/DistributedCache.cs @@ -205,7 +205,7 @@ namespace Umbraco.Web.Cache // helper method to get an ICacheRefresher by its unique identifier private static ICacheRefresher GetRefresherById(Guid refresherGuid) { - return CacheRefreshersResolver.Current.GetById(refresherGuid); + return Current.CacheRefreshers[refresherGuid]; } } } diff --git a/src/Umbraco.Web/Current.cs b/src/Umbraco.Web/Current.cs index d2ad437b53..fb4704b504 100644 --- a/src/Umbraco.Web/Current.cs +++ b/src/Umbraco.Web/Current.cs @@ -1,5 +1,6 @@ using System; using LightInject; +using Umbraco.Core.Cache; using Umbraco.Core.Events; using Umbraco.Core.Strings; using Umbraco.Web.PublishedCache; @@ -122,6 +123,8 @@ namespace Umbraco.Web public static UrlSegmentProviderCollection UrlSegmentProviders => CoreCurrent.Container.GetInstance(); + public static CacheRefresherCollection CacheRefreshers + => Container.GetInstance(); #endregion } diff --git a/src/Umbraco.Web/umbraco.presentation/umbraco/webservices/CacheRefresher.asmx.cs b/src/Umbraco.Web/umbraco.presentation/umbraco/webservices/CacheRefresher.asmx.cs index 4c732be52b..f6fafe7610 100644 --- a/src/Umbraco.Web/umbraco.presentation/umbraco/webservices/CacheRefresher.asmx.cs +++ b/src/Umbraco.Web/umbraco.presentation/umbraco/webservices/CacheRefresher.asmx.cs @@ -12,6 +12,7 @@ using Umbraco.Core.Logging; using Umbraco.Core.Sync; using Umbraco.Core.Security; using Umbraco.Core.Xml; +using Umbraco.Web; namespace umbraco.presentation.webservices { @@ -41,7 +42,7 @@ namespace umbraco.presentation.webservices private static ICacheRefresher GetRefresher(Guid id) { - var refresher = CacheRefreshersResolver.Current.GetById(id); + var refresher = Current.CacheRefreshers[id]; if (refresher == null) throw new InvalidOperationException("Cache refresher with ID \"" + id + "\" does not exist."); return refresher; @@ -179,7 +180,7 @@ namespace umbraco.presentation.webservices var xd = new XmlDocument(); xd.LoadXml(""); - foreach (var cr in CacheRefreshersResolver.Current.CacheRefreshers) + foreach (var cr in Current.CacheRefreshers) { var n = XmlHelper.AddTextNode(xd, "cacheRefresher", cr.Name); n.Attributes.Append(XmlHelper.AddAttribute(xd, "uniqueIdentifier", cr.RefresherUniqueId.ToString()));