From dc7b3612bc81a9afd5e38a6f03f5cd32101f7e9a Mon Sep 17 00:00:00 2001 From: Shannon Date: Tue, 5 May 2015 19:01:49 +1000 Subject: [PATCH] converts PropertyValueConvertersResolver to a container resolver and updates IPropertyValueConverter that were relying on singletons to use DependencyInjection --- src/Umbraco.Core/CoreBootManager.cs | 2 +- .../PropertyValueConvertersResolver.cs | 15 +++++----- src/Umbraco.Tests/LibraryTests.cs | 24 +++++++++++---- .../PublishedContentMoreTests.cs | 3 +- .../PublishedContentTestBase.cs | 3 +- .../TestHelpers/BaseDatabaseFactoryTest.cs | 2 +- .../MacroContainerValueConverter.cs | 17 +++++++---- .../RelatedLinksEditorValueConvertor.cs | 30 +++++++++++-------- .../RteMacroRenderingValueConverter.cs | 17 +++++++---- 9 files changed, 73 insertions(+), 40 deletions(-) diff --git a/src/Umbraco.Core/CoreBootManager.cs b/src/Umbraco.Core/CoreBootManager.cs index 3c4df27ba1..5c37dd642e 100644 --- a/src/Umbraco.Core/CoreBootManager.cs +++ b/src/Umbraco.Core/CoreBootManager.cs @@ -372,7 +372,7 @@ namespace Umbraco.Core // need to filter out the ones we dont want!! PropertyValueConvertersResolver.Current = new PropertyValueConvertersResolver( - ServiceProvider, ProfilingLogger.Logger, + Container, ProfilingLogger.Logger, PluginManager.ResolveTypes()); // use the new DefaultShortStringHelper diff --git a/src/Umbraco.Core/PropertyEditors/PropertyValueConvertersResolver.cs b/src/Umbraco.Core/PropertyEditors/PropertyValueConvertersResolver.cs index 622ed2661f..5d15877b79 100644 --- a/src/Umbraco.Core/PropertyEditors/PropertyValueConvertersResolver.cs +++ b/src/Umbraco.Core/PropertyEditors/PropertyValueConvertersResolver.cs @@ -2,6 +2,7 @@ using System; using System.Collections.Generic; using System.Linq; using System.Threading; +using Umbraco.Core.LightInject; using Umbraco.Core.Logging; using Umbraco.Core.ObjectResolution; @@ -10,30 +11,30 @@ namespace Umbraco.Core.PropertyEditors /// /// Resolves the IPropertyValueConverter objects. /// - public sealed class PropertyValueConvertersResolver : ManyObjectsResolverBase + public sealed class PropertyValueConvertersResolver : ContainerManyObjectsResolver { /// /// Initializes a new instance of the class with /// an initial list of converter types. /// - /// + /// /// /// The list of converter types /// The resolver is created by the WebBootManager and thus the constructor remains internal. - internal PropertyValueConvertersResolver(IServiceProvider serviceProvider, ILogger logger, IEnumerable converters) - : base(serviceProvider, logger, converters) + internal PropertyValueConvertersResolver(IServiceContainer container, ILogger logger, IEnumerable converters) + : base(container, logger, converters) { } /// /// Initializes a new instance of the class with /// an initial list of converter types. /// - /// + /// /// /// The list of converter types /// The resolver is created by the WebBootManager and thus the constructor remains internal. - internal PropertyValueConvertersResolver(IServiceProvider serviceProvider, ILogger logger, params Type[] converters) - : base(serviceProvider, logger, converters) + internal PropertyValueConvertersResolver(IServiceContainer container, ILogger logger, params Type[] converters) + : base(container, logger, converters) { } /// diff --git a/src/Umbraco.Tests/LibraryTests.cs b/src/Umbraco.Tests/LibraryTests.cs index 680fc43407..03deca8118 100644 --- a/src/Umbraco.Tests/LibraryTests.cs +++ b/src/Umbraco.Tests/LibraryTests.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; + using System.IO; using System.Linq; using System.Text; @@ -15,6 +16,7 @@ using Umbraco.Web; using Umbraco.Web.PublishedCache; using Umbraco.Web.PublishedCache.XmlPublishedCache; using umbraco; +using Umbraco.Core.LightInject; namespace Umbraco.Tests { @@ -26,12 +28,9 @@ namespace Umbraco.Tests public class LibraryTests : BaseRoutingTest { public override void Initialize() - { - // required so we can access property.Value - PropertyValueConvertersResolver.Current = new PropertyValueConvertersResolver(new ActivatorServiceProvider(), Logger); - + { base.Initialize(); - + // need to specify a custom callback for unit tests // AutoPublishedContentTypes generates properties automatically // when they are requested, but we must declare those that we @@ -52,7 +51,20 @@ namespace Umbraco.Tests UmbracoContext.Current = routingContext.UmbracoContext; } - public override void TearDown() + /// + /// sets up resolvers before resolution is frozen + /// + protected override void FreezeResolution() + { + // required so we can access property.Value + PropertyValueConvertersResolver.Current = new PropertyValueConvertersResolver( + Container, + Logger); + + base.FreezeResolution(); + } + + public override void TearDown() { base.TearDown(); UmbracoContext.Current = null; diff --git a/src/Umbraco.Tests/PublishedContent/PublishedContentMoreTests.cs b/src/Umbraco.Tests/PublishedContent/PublishedContentMoreTests.cs index 7c74d093ba..603ce1a01e 100644 --- a/src/Umbraco.Tests/PublishedContent/PublishedContentMoreTests.cs +++ b/src/Umbraco.Tests/PublishedContent/PublishedContentMoreTests.cs @@ -11,6 +11,7 @@ using Umbraco.Core.PropertyEditors; using Umbraco.Web; using Umbraco.Tests.TestHelpers; using umbraco.BusinessLogic; +using Umbraco.Core.LightInject; using Umbraco.Web.PublishedCache.XmlPublishedCache; using Umbraco.Web.Security; @@ -44,7 +45,7 @@ namespace Umbraco.Tests.PublishedContent protected override void FreezeResolution() { PropertyValueConvertersResolver.Current = - new PropertyValueConvertersResolver(new ActivatorServiceProvider(), Logger); + new PropertyValueConvertersResolver(Container, Logger); var types = PluginManager.Current.ResolveTypes(); PublishedContentModelFactoryResolver.Current = new PublishedContentModelFactoryResolver(new PublishedContentModelFactory(types)); diff --git a/src/Umbraco.Tests/PublishedContent/PublishedContentTestBase.cs b/src/Umbraco.Tests/PublishedContent/PublishedContentTestBase.cs index 789d9f7218..b819f9252f 100644 --- a/src/Umbraco.Tests/PublishedContent/PublishedContentTestBase.cs +++ b/src/Umbraco.Tests/PublishedContent/PublishedContentTestBase.cs @@ -3,6 +3,7 @@ using System.IO; using System.Linq; using Umbraco.Core; using Umbraco.Core.Configuration; +using Umbraco.Core.LightInject; using Umbraco.Core.Models; using Umbraco.Core.Models.PublishedContent; using Umbraco.Core.PropertyEditors; @@ -41,7 +42,7 @@ namespace Umbraco.Tests.PublishedContent { if (PropertyValueConvertersResolver.HasCurrent == false) PropertyValueConvertersResolver.Current = new PropertyValueConvertersResolver( - new ActivatorServiceProvider(), Logger, + Container, Logger, new[] { typeof(DatePickerValueConverter), diff --git a/src/Umbraco.Tests/TestHelpers/BaseDatabaseFactoryTest.cs b/src/Umbraco.Tests/TestHelpers/BaseDatabaseFactoryTest.cs index 566a7bd7c0..2ed6e7c1e9 100644 --- a/src/Umbraco.Tests/TestHelpers/BaseDatabaseFactoryTest.cs +++ b/src/Umbraco.Tests/TestHelpers/BaseDatabaseFactoryTest.cs @@ -239,7 +239,7 @@ namespace Umbraco.Tests.TestHelpers new ManifestParser(Logger, new DirectoryInfo(IOHelper.MapPath("~/App_Plugins")), new NullCacheProvider()))); if (PropertyValueConvertersResolver.HasCurrent == false) - PropertyValueConvertersResolver.Current = new PropertyValueConvertersResolver(new ActivatorServiceProvider(), Logger); + PropertyValueConvertersResolver.Current = new PropertyValueConvertersResolver(Container, Logger); if (PublishedContentModelFactoryResolver.HasCurrent == false) PublishedContentModelFactoryResolver.Current = new PublishedContentModelFactoryResolver(); diff --git a/src/Umbraco.Web/PropertyEditors/ValueConverters/MacroContainerValueConverter.cs b/src/Umbraco.Web/PropertyEditors/ValueConverters/MacroContainerValueConverter.cs index 436d131bcd..783f271230 100644 --- a/src/Umbraco.Web/PropertyEditors/ValueConverters/MacroContainerValueConverter.cs +++ b/src/Umbraco.Web/PropertyEditors/ValueConverters/MacroContainerValueConverter.cs @@ -17,6 +17,13 @@ namespace Umbraco.Web.PropertyEditors.ValueConverters [DefaultPropertyValueConverter] public class MacroContainerValueConverter : PropertyValueConverterBase { + private readonly UmbracoContext _umbracoContext; + + public MacroContainerValueConverter(UmbracoContext umbracoContext) + { + _umbracoContext = umbracoContext; + } + public override bool IsConverter(PublishedPropertyType propertyType) { return propertyType.PropertyEditorAlias == Constants.PropertyEditors.MacroContainerAlias; @@ -26,17 +33,17 @@ namespace Umbraco.Web.PropertyEditors.ValueConverters // global UmbracoContext.Current.InPreviewMode status. So it // should never execute in // over the same UmbracoContext with // different preview modes. - static string RenderMacros(string source, bool preview) + string RenderMacros(string source, bool preview) { // save and set for macro rendering - var inPreviewMode = UmbracoContext.Current.InPreviewMode; - UmbracoContext.Current.InPreviewMode = preview; + var inPreviewMode = _umbracoContext.InPreviewMode; + _umbracoContext.InPreviewMode = preview; var sb = new StringBuilder(); try { - var umbracoHelper = new UmbracoHelper(UmbracoContext.Current); + var umbracoHelper = new UmbracoHelper(_umbracoContext); MacroTagParser.ParseMacros( source, //callback for when text block is found @@ -50,7 +57,7 @@ namespace Umbraco.Web.PropertyEditors.ValueConverters finally { // restore - UmbracoContext.Current.InPreviewMode = inPreviewMode; + _umbracoContext.InPreviewMode = inPreviewMode; } return sb.ToString(); diff --git a/src/Umbraco.Web/PropertyEditors/ValueConverters/RelatedLinksEditorValueConvertor.cs b/src/Umbraco.Web/PropertyEditors/ValueConverters/RelatedLinksEditorValueConvertor.cs index 9d3b50f2d9..974046473f 100644 --- a/src/Umbraco.Web/PropertyEditors/ValueConverters/RelatedLinksEditorValueConvertor.cs +++ b/src/Umbraco.Web/PropertyEditors/ValueConverters/RelatedLinksEditorValueConvertor.cs @@ -19,6 +19,13 @@ namespace Umbraco.Web.PropertyEditors.ValueConverters [DefaultPropertyValueConverter(typeof(JsonValueConverter))] //this shadows the JsonValueConverter public class RelatedLinksEditorValueConvertor : PropertyValueConverterBase { + private readonly UmbracoContext _umbracoContext; + + public RelatedLinksEditorValueConvertor(UmbracoContext umbracoContext) + { + _umbracoContext = umbracoContext; + } + public override bool IsConverter(PublishedPropertyType propertyType) { return Constants.PropertyEditors.RelatedLinksAlias.Equals(propertyType.PropertyEditorAlias); @@ -35,23 +42,20 @@ namespace Umbraco.Web.PropertyEditors.ValueConverters { var obj = JsonConvert.DeserializeObject(sourceString); //update the internal links if we have a context - if (UmbracoContext.Current != null) + var helper = new UmbracoHelper(_umbracoContext); + foreach (var a in obj) { - var helper = new UmbracoHelper(UmbracoContext.Current); - foreach (var a in obj) + var type = a.Value("type"); + if (type.IsNullOrWhiteSpace() == false) { - var type = a.Value("type"); - if (type.IsNullOrWhiteSpace() == false) + if (type == "internal") { - if (type == "internal") - { - var linkId = a.Value("link"); - var link = helper.NiceUrl(linkId); - a["link"] = link; - } + var linkId = a.Value("link"); + var link = helper.NiceUrl(linkId); + a["link"] = link; } - } - } + } + } return obj; } catch (Exception ex) diff --git a/src/Umbraco.Web/PropertyEditors/ValueConverters/RteMacroRenderingValueConverter.cs b/src/Umbraco.Web/PropertyEditors/ValueConverters/RteMacroRenderingValueConverter.cs index 548d4357db..6734854e46 100644 --- a/src/Umbraco.Web/PropertyEditors/ValueConverters/RteMacroRenderingValueConverter.cs +++ b/src/Umbraco.Web/PropertyEditors/ValueConverters/RteMacroRenderingValueConverter.cs @@ -24,21 +24,28 @@ namespace Umbraco.Web.PropertyEditors.ValueConverters [PropertyValueCache(PropertyCacheValue.All, PropertyCacheLevel.Request)] public class RteMacroRenderingValueConverter : TinyMceValueConverter { + private readonly UmbracoContext _umbracoContext; + + public RteMacroRenderingValueConverter(UmbracoContext umbracoContext) + { + _umbracoContext = umbracoContext; + } + // NOT thread-safe over a request because it modifies the // global UmbracoContext.Current.InPreviewMode status. So it // should never execute in // over the same UmbracoContext with // different preview modes. - static string RenderRteMacros(string source, bool preview) + string RenderRteMacros(string source, bool preview) { // save and set for macro rendering - var inPreviewMode = UmbracoContext.Current.InPreviewMode; - UmbracoContext.Current.InPreviewMode = preview; + var inPreviewMode = _umbracoContext.InPreviewMode; + _umbracoContext.InPreviewMode = preview; var sb = new StringBuilder(); try { - var umbracoHelper = new UmbracoHelper(UmbracoContext.Current); + var umbracoHelper = new UmbracoHelper(_umbracoContext); MacroTagParser.ParseMacros( source, //callback for when text block is found @@ -52,7 +59,7 @@ namespace Umbraco.Web.PropertyEditors.ValueConverters finally { // restore - UmbracoContext.Current.InPreviewMode = inPreviewMode; + _umbracoContext.InPreviewMode = inPreviewMode; } return sb.ToString();