From 8f48df66d5a371aaa49576b13a32e2c10974510f Mon Sep 17 00:00:00 2001 From: Shannon Date: Tue, 19 Nov 2019 11:16:07 +1100 Subject: [PATCH] Refactors Configs and how it acquires a factory, re-internalizes Umbraco.Configuration classes --- .../Composing/Composition.cs | 6 +++--- .../Configuration/Configs.cs | 18 +++++------------- .../CommaDelimitedConfigurationElement.cs | 2 +- .../InnerTextConfigurationElement.cs | 2 +- ...tionalCommaDelimitedConfigurationElement.cs | 2 +- .../RawXmlConfigurationElement.cs | 2 +- 6 files changed, 12 insertions(+), 20 deletions(-) diff --git a/src/Umbraco.Abstractions/Composing/Composition.cs b/src/Umbraco.Abstractions/Composing/Composition.cs index 03c8777e89..8cf02151e8 100644 --- a/src/Umbraco.Abstractions/Composing/Composition.cs +++ b/src/Umbraco.Abstractions/Composing/Composition.cs @@ -124,14 +124,14 @@ namespace Umbraco.Core.Composing builder.RegisterWith(_register); _builders.Clear(); // no point keep them around - Configs.RegisterWith(_register); - IFactory factory = null; + + Configs.RegisterWith(_register, () => factory); + // ReSharper disable once AccessToModifiedClosure -- on purpose _register.Register(_ => factory, Lifetime.Singleton); factory = _register.CreateFactory(); - Configs.Factory = factory; return factory; } diff --git a/src/Umbraco.Abstractions/Configuration/Configs.cs b/src/Umbraco.Abstractions/Configuration/Configs.cs index ef6a086af5..66980d83a6 100644 --- a/src/Umbraco.Abstractions/Configuration/Configs.cs +++ b/src/Umbraco.Abstractions/Configuration/Configs.cs @@ -15,16 +15,6 @@ namespace Umbraco.Core.Configuration { private readonly Func _configGetter; - public IFactory Factory - { - get => _factory; - set - { - if(!(_factory is null)) throw new InvalidOperationException("Factory cannot be set multiple times"); - _factory = value; - } - } - public Configs(Func configGetter) { _configGetter = configGetter; @@ -32,7 +22,7 @@ namespace Umbraco.Core.Configuration private readonly Dictionary> _configs = new Dictionary>(); private Dictionary> _registerings = new Dictionary>(); - private IFactory _factory; + private Lazy _factory; /// /// Gets a configuration. @@ -76,7 +66,7 @@ namespace Umbraco.Core.Configuration _configs[typeOfConfig] = new Lazy(() => { - if (!(Factory is null)) return Factory.GetInstance(); + if (!(_factory is null)) return _factory.Value.GetInstance(); throw new InvalidOperationException($"Cannot get configuration of type {typeOfConfig} during composition."); }); _registerings[typeOfConfig] = register => register.Register(configFactory, Lifetime.Singleton); @@ -109,12 +99,14 @@ namespace Umbraco.Core.Configuration /// /// Registers configurations in a register. /// - public void RegisterWith(IRegister register) + public void RegisterWith(IRegister register, Func factory) { // do it only once if (_registerings == null) throw new InvalidOperationException("Configurations have already been registered."); + _factory = new Lazy(factory); + register.Register(this); foreach (var registering in _registerings.Values) diff --git a/src/Umbraco.Configuration/CommaDelimitedConfigurationElement.cs b/src/Umbraco.Configuration/CommaDelimitedConfigurationElement.cs index 00dde5f206..3ced2fab46 100644 --- a/src/Umbraco.Configuration/CommaDelimitedConfigurationElement.cs +++ b/src/Umbraco.Configuration/CommaDelimitedConfigurationElement.cs @@ -8,7 +8,7 @@ namespace Umbraco.Core.Configuration /// /// Defines a configuration section that contains inner text that is comma delimited /// - public class CommaDelimitedConfigurationElement : InnerTextConfigurationElement, IEnumerable + internal class CommaDelimitedConfigurationElement : InnerTextConfigurationElement, IEnumerable { public override CommaDelimitedStringCollection Value { diff --git a/src/Umbraco.Configuration/InnerTextConfigurationElement.cs b/src/Umbraco.Configuration/InnerTextConfigurationElement.cs index 3ff0c4d735..6a125f2c1b 100644 --- a/src/Umbraco.Configuration/InnerTextConfigurationElement.cs +++ b/src/Umbraco.Configuration/InnerTextConfigurationElement.cs @@ -9,7 +9,7 @@ namespace Umbraco.Core.Configuration /// {element}MyValue{/element} instead of as attribute values. /// /// - public class InnerTextConfigurationElement : RawXmlConfigurationElement + internal class InnerTextConfigurationElement : RawXmlConfigurationElement { public InnerTextConfigurationElement() { diff --git a/src/Umbraco.Configuration/OptionalCommaDelimitedConfigurationElement.cs b/src/Umbraco.Configuration/OptionalCommaDelimitedConfigurationElement.cs index b6771f98b0..610067d2db 100644 --- a/src/Umbraco.Configuration/OptionalCommaDelimitedConfigurationElement.cs +++ b/src/Umbraco.Configuration/OptionalCommaDelimitedConfigurationElement.cs @@ -6,7 +6,7 @@ namespace Umbraco.Core.Configuration /// /// Used for specifying default values for comma delimited config /// - public class OptionalCommaDelimitedConfigurationElement : CommaDelimitedConfigurationElement + internal class OptionalCommaDelimitedConfigurationElement : CommaDelimitedConfigurationElement { private readonly CommaDelimitedConfigurationElement _wrapped; private readonly string[] _defaultValue; diff --git a/src/Umbraco.Configuration/RawXmlConfigurationElement.cs b/src/Umbraco.Configuration/RawXmlConfigurationElement.cs index d7f0ed0332..5bc6ad3d32 100644 --- a/src/Umbraco.Configuration/RawXmlConfigurationElement.cs +++ b/src/Umbraco.Configuration/RawXmlConfigurationElement.cs @@ -8,7 +8,7 @@ namespace Umbraco.Core.Configuration /// A configuration section that simply exposes the entire raw xml of the section itself which inheritors can use /// to do with as they please. /// - public abstract class RawXmlConfigurationElement : ConfigurationElement + internal abstract class RawXmlConfigurationElement : ConfigurationElement { protected RawXmlConfigurationElement() {