diff --git a/src/Umbraco.Core/CacheRefreshersResolver.cs b/src/Umbraco.Core/CacheRefreshersResolver.cs index 51c6cfc183..e01dfba01a 100644 --- a/src/Umbraco.Core/CacheRefreshersResolver.cs +++ b/src/Umbraco.Core/CacheRefreshersResolver.cs @@ -31,7 +31,7 @@ namespace Umbraco.Core { get { - EnsureIdsAreTracked(); + EnsureIsInitialized(); return Values; } } diff --git a/src/Umbraco.Core/CoreBootManager.cs b/src/Umbraco.Core/CoreBootManager.cs index 9443a8abce..a5e9fa43cb 100644 --- a/src/Umbraco.Core/CoreBootManager.cs +++ b/src/Umbraco.Core/CoreBootManager.cs @@ -12,6 +12,7 @@ using Umbraco.Core.Persistence.Migrations.Upgrades.TargetVersionSix; using Umbraco.Core.Persistence.UnitOfWork; using Umbraco.Core.PropertyEditors; using Umbraco.Core.Publishing; +using Umbraco.Core.Macros; using Umbraco.Core.Services; using MigrationsVersionFourNineZero = Umbraco.Core.Persistence.Migrations.Upgrades.TargetVersionFourNineZero; diff --git a/src/Umbraco.Core/DataTypesResolver.cs b/src/Umbraco.Core/DataTypesResolver.cs index 65dced66b3..325afe8690 100644 --- a/src/Umbraco.Core/DataTypesResolver.cs +++ b/src/Umbraco.Core/DataTypesResolver.cs @@ -27,7 +27,7 @@ namespace Umbraco.Core { get { - EnsureIdsAreTracked(); + EnsureIsInitialized(); return Values; } } diff --git a/src/Umbraco.Core/ObjectResolution/MacroFieldEditorsResolver.cs b/src/Umbraco.Core/Macros/MacroFieldEditorsResolver.cs similarity index 91% rename from src/Umbraco.Core/ObjectResolution/MacroFieldEditorsResolver.cs rename to src/Umbraco.Core/Macros/MacroFieldEditorsResolver.cs index 6015c14d94..df7dc4fbf4 100644 --- a/src/Umbraco.Core/ObjectResolution/MacroFieldEditorsResolver.cs +++ b/src/Umbraco.Core/Macros/MacroFieldEditorsResolver.cs @@ -1,15 +1,13 @@ using System; using System.Collections.Generic; -using System.Linq; using System.Web; using System.Web.UI; -using Umbraco.Core.Macros; +using System.Linq; +using Umbraco.Core.ObjectResolution; using umbraco.interfaces; -namespace Umbraco.Core.ObjectResolution +namespace Umbraco.Core.Macros { - // FIXME - specific resolvers should not be in Umbraco.Core.ObjectResolution ?? - /// /// A resolver to return all IMacroGuiRendering objects /// diff --git a/src/Umbraco.Core/ObjectResolution/LazyManyObjectsResolverbase.cs b/src/Umbraco.Core/ObjectResolution/LazyManyObjectsResolverbase.cs index 21374a48f5..7731916a7f 100644 --- a/src/Umbraco.Core/ObjectResolution/LazyManyObjectsResolverbase.cs +++ b/src/Umbraco.Core/ObjectResolution/LazyManyObjectsResolverbase.cs @@ -149,9 +149,8 @@ namespace Umbraco.Core.ObjectResolution { EnsureAddSupport(); - EnsureResolutionNotFrozen(); - - using (GetWriteLock()) + using (Resolution.Configuration) + using (GetWriteLock()) { foreach (var t in types) { @@ -168,9 +167,8 @@ namespace Umbraco.Core.ObjectResolution { EnsureAddSupport(); - EnsureResolutionNotFrozen(); - - using (GetWriteLock()) + using (Resolution.Configuration) + using (GetWriteLock()) { _listOfTypeListDelegates.Add(typeListDelegate); } @@ -184,9 +182,8 @@ namespace Umbraco.Core.ObjectResolution { EnsureAddSupport(); - EnsureResolutionNotFrozen(); - - using (GetWriteLock()) + using (Resolution.Configuration) + using (GetWriteLock()) { _lazyTypeList.Add(value); } @@ -208,9 +205,8 @@ namespace Umbraco.Core.ObjectResolution { EnsureClearSupport(); - EnsureResolutionNotFrozen(); - - using (GetWriteLock()) + using (Resolution.Configuration) + using (GetWriteLock()) { _lazyTypeList.Clear(); } diff --git a/src/Umbraco.Core/ObjectResolution/LegacyTransientObjectsResolver.cs b/src/Umbraco.Core/ObjectResolution/LegacyTransientObjectsResolver.cs index 18d67f3b41..23eb1f7565 100644 --- a/src/Umbraco.Core/ObjectResolution/LegacyTransientObjectsResolver.cs +++ b/src/Umbraco.Core/ObjectResolution/LegacyTransientObjectsResolver.cs @@ -7,10 +7,10 @@ using System.Threading; namespace Umbraco.Core.ObjectResolution { /// - /// A base resolver used for old legacy factories such as the DataTypeFactory or CacheResolverFactory. + /// The base class for old legacy factories such as the DataTypeFactory or CacheResolverFactory. /// - /// - /// + /// The type of the concrete resolver class. + /// The type of the resolved objects. /// /// This class contains basic functionality to mimic the functionality in these old factories since they all return /// transient objects (though this should be changed) and the method GetById needs to lookup a type to an ID and since @@ -21,7 +21,9 @@ namespace Umbraco.Core.ObjectResolution where TResolved : class where TResolver : class { - + private readonly ReaderWriterLockSlim _lock = new ReaderWriterLockSlim(); + private ConcurrentDictionary _id2type; + #region Constructors /// @@ -40,46 +42,45 @@ namespace Umbraco.Core.ObjectResolution #endregion /// - /// Maintains a list of Ids and their types when first call to CacheResolvers or GetById occurs, this is used - /// in order to return a single object by id without instantiating the entire type stack. + /// Returns the unique identifier of the type of a specified object. /// - private ConcurrentDictionary _trackIdToType; - private readonly ReaderWriterLockSlim _lock = new ReaderWriterLockSlim(); + /// The object. + /// The unique identifier of the type of . + protected abstract Guid GetUniqueIdentifier(TResolved value); /// - /// method to return the unique id for type T + /// Returns a new instance for the type identified by its unique type identifier. /// - /// - /// - protected abstract Guid GetUniqueIdentifier(TResolved obj); - - /// - /// Returns a new TResolved instance by id - /// - /// - /// + /// The type identifier. + /// The value of the type uniquely identified by . public TResolved GetById(Guid id) { - EnsureIdsAreTracked(); - return !_trackIdToType.ContainsKey(id) + EnsureIsInitialized(); + return !_id2type.ContainsKey(id) ? null - : PluginManager.Current.CreateInstance(_trackIdToType[id]); + : PluginManager.Current.CreateInstance(_id2type[id]); } /// - /// Populates the ids -> Type dictionary to allow us to instantiate a type by Id since these legacy types doesn't contain any metadata + /// Populates the identifiers-to-types dictionnary. /// - protected void EnsureIdsAreTracked() + /// + /// This allow us to instantiate a type by ID since these legacy types doesn't contain any metadata. + /// We instanciate all types once to get their unique identifier, then build the dictionary so that + /// when GetById is called, we can instanciate a single object. + /// + protected void EnsureIsInitialized() { using (var l = new UpgradeableReadLock(_lock)) { - if (_trackIdToType == null) + if (_id2type == null) { l.UpgradeToWriteLock(); - _trackIdToType = new ConcurrentDictionary(); - foreach (var v in Values) + + _id2type = new ConcurrentDictionary(); + foreach (var value in Values) { - _trackIdToType.TryAdd(GetUniqueIdentifier(v), v.GetType()); + _id2type.TryAdd(GetUniqueIdentifier(value), value.GetType()); } } } diff --git a/src/Umbraco.Core/ObjectResolution/ManyObjectsResolverBase.cs b/src/Umbraco.Core/ObjectResolution/ManyObjectsResolverBase.cs index 64d850c66e..93185a32d7 100644 --- a/src/Umbraco.Core/ObjectResolution/ManyObjectsResolverBase.cs +++ b/src/Umbraco.Core/ObjectResolution/ManyObjectsResolverBase.cs @@ -17,6 +17,7 @@ namespace Umbraco.Core.ObjectResolution { private IEnumerable _applicationInstances = null; private readonly ReaderWriterLockSlim _lock = new ReaderWriterLockSlim(); + private readonly string _httpContextKey; private readonly List _instanceTypes = new List(); private int _defaultPluginWeight = 10; @@ -41,6 +42,8 @@ namespace Umbraco.Core.ObjectResolution } LifetimeScope = scope; + if (scope == ObjectLifetimeScope.HttpRequest) + _httpContextKey = this.GetType().FullName; _instanceTypes = new List(); } @@ -56,6 +59,7 @@ namespace Umbraco.Core.ObjectResolution if (httpContext == null) throw new ArgumentNullException("httpContext"); LifetimeScope = ObjectLifetimeScope.HttpRequest; + _httpContextKey = this.GetType().FullName; CurrentHttpContext = httpContext; _instanceTypes = new List(); } @@ -155,10 +159,10 @@ namespace Umbraco.Core.ObjectResolution protected IEnumerable Values { get - { - // cannot return values unless resolution is frozen, or we can - if (!CanResolveBeforeFrozen && !Resolution.IsFrozen) - throw new InvalidOperationException("Values cannot be returned until resolution is frozen"); + { + // ensure we can + if (!CanResolveBeforeFrozen) + Resolution.EnsureIsFrozen(); // note: we apply .ToArray() to the output of CreateInstance() because that is an IEnumerable that // comes from the PluginManager we want to be _sure_ that it's not a Linq of some sort, but the @@ -168,16 +172,15 @@ namespace Umbraco.Core.ObjectResolution { case ObjectLifetimeScope.HttpRequest: // create new instances per HttpContext - var key = this.GetType().FullName; // use full type name as key using (var l = new UpgradeableReadLock(_lock)) { // create if not already there - if (CurrentHttpContext.Items[key] == null) + if (CurrentHttpContext.Items[_httpContextKey] == null) { l.UpgradeToWriteLock(); - CurrentHttpContext.Items[key] = CreateInstances().ToArray(); + CurrentHttpContext.Items[_httpContextKey] = CreateInstances().ToArray(); } - return (List)CurrentHttpContext.Items[key]; + return (List)CurrentHttpContext.Items[_httpContextKey]; } case ObjectLifetimeScope.Application: @@ -210,11 +213,13 @@ namespace Umbraco.Core.ObjectResolution return PluginManager.Current.CreateInstances(InstanceTypes); } + #region Types collection manipulation + /// /// Ensures that a type is a valid type for the resolver. /// /// The type to test. - /// the type is not a valid type for the resolver. + /// the type is not a valid type for the resolver. protected void EnsureCorrectType(Type value) { if (!TypeHelper.IsTypeAssignableFrom(value)) @@ -222,8 +227,6 @@ namespace Umbraco.Core.ObjectResolution "Type {0} is not an acceptable type for resolver {1}.", value.FullName, this.GetType().FullName)); } - #region Types collection manipulation - /// /// Removes a type. /// @@ -233,8 +236,8 @@ namespace Umbraco.Core.ObjectResolution public virtual void RemoveType(Type value) { EnsureRemoveSupport(); - EnsureResolutionNotFrozen(); + using (Resolution.Configuration) using (var l = new UpgradeableReadLock(_lock)) { EnsureCorrectType(value); @@ -265,8 +268,8 @@ namespace Umbraco.Core.ObjectResolution protected void AddTypes(IEnumerable types) { EnsureAddSupport(); - EnsureResolutionNotFrozen(); + using (Resolution.Configuration) using (new WriteLock(_lock)) { foreach(var t in types) @@ -292,8 +295,8 @@ namespace Umbraco.Core.ObjectResolution public virtual void AddType(Type value) { EnsureAddSupport(); - EnsureResolutionNotFrozen(); + using (Resolution.Configuration) using (var l = new UpgradeableReadLock(_lock)) { EnsureCorrectType(value); @@ -327,8 +330,8 @@ namespace Umbraco.Core.ObjectResolution public virtual void Clear() { EnsureClearSupport(); - EnsureResolutionNotFrozen(); + using (Resolution.Configuration) using (new WriteLock(_lock)) { _instanceTypes.Clear(); @@ -346,8 +349,8 @@ namespace Umbraco.Core.ObjectResolution public virtual void InsertType(int index, Type value) { EnsureInsertSupport(); - EnsureResolutionNotFrozen(); + using (Resolution.Configuration) using (var l = new UpgradeableReadLock(_lock)) { EnsureCorrectType(value); @@ -373,6 +376,7 @@ namespace Umbraco.Core.ObjectResolution InsertType(index, typeof(T)); } + /// /// Inserts a type before a specified, already existing type. /// /// The existing type before which to insert. @@ -383,8 +387,8 @@ namespace Umbraco.Core.ObjectResolution public virtual void InsertTypeBefore(Type existingType, Type value) { EnsureInsertSupport(); - EnsureResolutionNotFrozen(); + using (Resolution.Configuration) using (var l = new UpgradeableReadLock(_lock)) { EnsureCorrectType(existingType); @@ -452,15 +456,6 @@ namespace Umbraco.Core.ObjectResolution { return new WriteLock(_lock); } - - /// - /// Throws an exception if resolution is frozen - /// - protected void EnsureResolutionNotFrozen() - { - if (Resolution.IsFrozen) - throw new InvalidOperationException("The type list cannot be modified after resolution has been frozen"); - } /// /// Throws an exception if this does not support Remove diff --git a/src/Umbraco.Core/ObjectResolution/Resolution.cs b/src/Umbraco.Core/ObjectResolution/Resolution.cs index 8e0670d169..3254da30c5 100644 --- a/src/Umbraco.Core/ObjectResolution/Resolution.cs +++ b/src/Umbraco.Core/ObjectResolution/Resolution.cs @@ -1,4 +1,5 @@ using System; +using System.Threading; namespace Umbraco.Core.ObjectResolution { @@ -6,12 +7,12 @@ namespace Umbraco.Core.ObjectResolution /// Represents the status of objects resolution. /// /// - /// Objects resolution can be frozen ie nothing can change anymore. - /// Nothing in resolution is thread-safe, because everything should take place when the application is starting. + /// Before resolution is frozen it is possible to access its configuration, but not to get values. + /// Once resolution is frozen, it is not possible to access its configuration anymore, but it is possible to get values. /// - internal class Resolution + internal static class Resolution { - // NOTE : must clarify freezing... SingleObjectResolverBase does not honor it... + private static readonly ReaderWriterLockSlim _lock = new ReaderWriterLockSlim(); /// /// Occurs when resolution is frozen. @@ -22,17 +23,30 @@ namespace Umbraco.Core.ObjectResolution /// /// Gets or sets a value indicating whether resolution of objects is frozen. /// - /// The internal setter is to be used in unit tests. - public static bool IsFrozen { get; internal set; } + public static bool IsFrozen { get; private set; } + + public static void EnsureIsFrozen() + { + if (!IsFrozen) + throw new Exception("Resolution is not frozen, it is not yet possible to get values from it."); + } /// - /// Ensures that resolution is not frozen, else throws. + /// Returns a disposable object that represents safe access to unfrozen resolution configuration. /// - /// resolution is frozen. - public static void EnsureNotFrozen() + /// Should be used in a using(Resolution.Configuration) { ... } mode. + public static IDisposable Configuration { - if (Resolution.IsFrozen) - throw new InvalidOperationException("Resolution is frozen. It is not possible to modify resolvers once resolution is frozen."); + get + { + IDisposable l = new WriteLock(_lock); + if (Resolution.IsFrozen) + { + l.Dispose(); + throw new InvalidOperationException("Resolution is frozen, it is not possible to configure it anymore."); + } + return l; + } } /// @@ -48,5 +62,14 @@ namespace Umbraco.Core.ObjectResolution if (Frozen != null) Frozen(null, null); } + + /// + /// Unfreezes resolution. + /// + /// To be used in unit tests. + internal static void Unfreeze() + { + IsFrozen = false; + } } } diff --git a/src/Umbraco.Core/ObjectResolution/ResolverBase.cs b/src/Umbraco.Core/ObjectResolution/ResolverBase.cs index f212005d36..8c07aa306e 100644 --- a/src/Umbraco.Core/ObjectResolution/ResolverBase.cs +++ b/src/Umbraco.Core/ObjectResolution/ResolverBase.cs @@ -63,7 +63,10 @@ namespace Umbraco.Core.ObjectResolution /// To be used in unit tests. internal static void Reset() { - _resolver = null; + using (new WriteLock(ResolversLock)) + { + _resolver = null; + } } } } diff --git a/src/Umbraco.Core/ObjectResolution/SingleObjectResolverBase.cs b/src/Umbraco.Core/ObjectResolution/SingleObjectResolverBase.cs index 6940f908ee..224467db6f 100644 --- a/src/Umbraco.Core/ObjectResolution/SingleObjectResolverBase.cs +++ b/src/Umbraco.Core/ObjectResolution/SingleObjectResolverBase.cs @@ -1,4 +1,5 @@ using System; +using System.Threading; namespace Umbraco.Core.ObjectResolution { @@ -14,10 +15,9 @@ namespace Umbraco.Core.ObjectResolution where TResolved : class where TResolver : class { - TResolved _resolved; - readonly bool _canBeNull; - - // NOTE - we're not freezing resolution here so it is potentially possible to change the instance at any time? + private readonly ReaderWriterLockSlim _lock = new ReaderWriterLockSlim(); + private readonly bool _canBeNull; + private TResolved _value; #region Constructors @@ -39,7 +39,7 @@ namespace Umbraco.Core.ObjectResolution protected SingleObjectResolverBase(TResolved value) : this(false) { - _resolved = value; + _value = value; } /// @@ -63,7 +63,7 @@ namespace Umbraco.Core.ObjectResolution /// otherwise an exception will be thrown when reading it. protected SingleObjectResolverBase(TResolved value, bool canBeNull) { - _resolved = value; + _value = value; _canBeNull = canBeNull; } @@ -82,7 +82,7 @@ namespace Umbraco.Core.ObjectResolution /// public bool HasValue { - get { return _resolved != null; } + get { return _value != null; } } /// @@ -90,21 +90,34 @@ namespace Umbraco.Core.ObjectResolution /// /// /// value is set to null, but cannot be null (CanBeNull is false). - /// value is read and is null, but cannot be null (CanBeNull is false). + /// value is read and is null, but cannot be null (CanBeNull is false), + /// or value is set (read) and resolution is (not) frozen. protected TResolved Value { get { - if (!_canBeNull && _resolved == null) - throw new InvalidOperationException(""); - return _resolved; + Resolution.EnsureIsFrozen(); + using (new ReadLock(_lock)) + { + if (!_canBeNull && _value == null) + throw new InvalidOperationException(string.Format( + "Resolver {0} requires a value, and none was supplied.", this.GetType().FullName)); + + return _value; + } } set { - if (!_canBeNull && value == null) - throw new ArgumentNullException("value"); - _resolved = value; + using (Resolution.Configuration) + using (var l = new UpgradeableReadLock(_lock)) + { + if (!_canBeNull && value == null) + throw new ArgumentNullException("value"); + + l.UpgradeToWriteLock(); + _value = value; + } } } } diff --git a/src/Umbraco.Core/Umbraco.Core.csproj b/src/Umbraco.Core/Umbraco.Core.csproj index 7fa536d3f5..61a7e21275 100644 --- a/src/Umbraco.Core/Umbraco.Core.csproj +++ b/src/Umbraco.Core/Umbraco.Core.csproj @@ -440,7 +440,7 @@ - + @@ -605,7 +605,7 @@ - + diff --git a/src/Umbraco.Tests/CacheRefresherFactoryTests.cs b/src/Umbraco.Tests/CacheRefresherFactoryTests.cs index 782638a1db..726bb1c9bc 100644 --- a/src/Umbraco.Tests/CacheRefresherFactoryTests.cs +++ b/src/Umbraco.Tests/CacheRefresherFactoryTests.cs @@ -35,7 +35,7 @@ namespace Umbraco.Tests public void TearDown() { CacheRefreshersResolver.Reset(); - Resolution.IsFrozen = false; + Resolution.Unfreeze(); } [Test] diff --git a/src/Umbraco.Tests/CodeFirst/CodeFirstTests.cs b/src/Umbraco.Tests/CodeFirst/CodeFirstTests.cs index a85138864f..d371f7e709 100644 --- a/src/Umbraco.Tests/CodeFirst/CodeFirstTests.cs +++ b/src/Umbraco.Tests/CodeFirst/CodeFirstTests.cs @@ -233,7 +233,7 @@ namespace Umbraco.Tests.CodeFirst //reset the app context DataTypesResolver.Reset(); ApplicationContext.Current = null; - Resolution.IsFrozen = false; + Resolution.Unfreeze(); PluginManager.Current = null; string path = TestHelper.CurrentAssemblyDirectory; diff --git a/src/Umbraco.Tests/DataTypeFactoryTests.cs b/src/Umbraco.Tests/DataTypeFactoryTests.cs index fadc45a843..734b0260c7 100644 --- a/src/Umbraco.Tests/DataTypeFactoryTests.cs +++ b/src/Umbraco.Tests/DataTypeFactoryTests.cs @@ -37,7 +37,7 @@ namespace Umbraco.Tests public void TearDown() { DataTypesResolver.Reset(); - Resolution.IsFrozen = false; + Resolution.Unfreeze(); } [Test] diff --git a/src/Umbraco.Tests/Migrations/FindingMigrationsTest.cs b/src/Umbraco.Tests/Migrations/FindingMigrationsTest.cs index 7601aa2f59..5ef819b962 100644 --- a/src/Umbraco.Tests/Migrations/FindingMigrationsTest.cs +++ b/src/Umbraco.Tests/Migrations/FindingMigrationsTest.cs @@ -75,7 +75,7 @@ namespace Umbraco.Tests.Migrations public void TearDown() { MigrationResolver.Reset(); - Resolution.IsFrozen = false; + Resolution.Unfreeze(); } } } \ No newline at end of file diff --git a/src/Umbraco.Tests/Migrations/TargetVersionSixthMigrationsTest.cs b/src/Umbraco.Tests/Migrations/TargetVersionSixthMigrationsTest.cs index beb1d2058d..c56dbf55eb 100644 --- a/src/Umbraco.Tests/Migrations/TargetVersionSixthMigrationsTest.cs +++ b/src/Umbraco.Tests/Migrations/TargetVersionSixthMigrationsTest.cs @@ -70,7 +70,7 @@ namespace Umbraco.Tests.Migrations public void TearDown() { MigrationResolver.Reset(); - Resolution.IsFrozen = false; + Resolution.Unfreeze(); } } } \ No newline at end of file diff --git a/src/Umbraco.Tests/Migrations/Upgrades/BaseUpgradeTest.cs b/src/Umbraco.Tests/Migrations/Upgrades/BaseUpgradeTest.cs index 326aa304c2..871ecf3c29 100644 --- a/src/Umbraco.Tests/Migrations/Upgrades/BaseUpgradeTest.cs +++ b/src/Umbraco.Tests/Migrations/Upgrades/BaseUpgradeTest.cs @@ -95,7 +95,7 @@ namespace Umbraco.Tests.Migrations.Upgrades PluginManager.Current = null; SyntaxConfig.SqlSyntaxProvider = null; MigrationResolver.Reset(); - Resolution.IsFrozen = false; + Resolution.Unfreeze(); TestHelper.CleanContentDirectories(); diff --git a/src/Umbraco.Tests/Persistence/MySqlTableByTableTest.cs b/src/Umbraco.Tests/Persistence/MySqlTableByTableTest.cs index 061a2414f6..80388d5c63 100644 --- a/src/Umbraco.Tests/Persistence/MySqlTableByTableTest.cs +++ b/src/Umbraco.Tests/Persistence/MySqlTableByTableTest.cs @@ -53,7 +53,7 @@ namespace Umbraco.Tests.Persistence //reset the app context ApplicationContext.Current = null; - Resolution.IsFrozen = false; + Resolution.Unfreeze(); RepositoryResolver.Reset(); } diff --git a/src/Umbraco.Tests/Persistence/SqlCeTableByTableTest.cs b/src/Umbraco.Tests/Persistence/SqlCeTableByTableTest.cs index d2dadc6879..eab36ac329 100644 --- a/src/Umbraco.Tests/Persistence/SqlCeTableByTableTest.cs +++ b/src/Umbraco.Tests/Persistence/SqlCeTableByTableTest.cs @@ -68,7 +68,7 @@ namespace Umbraco.Tests.Persistence //reset the app context ApplicationContext.Current = null; - Resolution.IsFrozen = false; + Resolution.Unfreeze(); RepositoryResolver.Reset(); } diff --git a/src/Umbraco.Tests/Persistence/SqlTableByTableTest.cs b/src/Umbraco.Tests/Persistence/SqlTableByTableTest.cs index 82097c487e..4c18b04b59 100644 --- a/src/Umbraco.Tests/Persistence/SqlTableByTableTest.cs +++ b/src/Umbraco.Tests/Persistence/SqlTableByTableTest.cs @@ -55,7 +55,7 @@ namespace Umbraco.Tests.Persistence //reset the app context ApplicationContext.Current = null; - Resolution.IsFrozen = false; + Resolution.Unfreeze(); RepositoryResolver.Reset(); } diff --git a/src/Umbraco.Tests/Publishing/PublishingStrategyTests.cs b/src/Umbraco.Tests/Publishing/PublishingStrategyTests.cs index 7e9a6ede54..074265e78e 100644 --- a/src/Umbraco.Tests/Publishing/PublishingStrategyTests.cs +++ b/src/Umbraco.Tests/Publishing/PublishingStrategyTests.cs @@ -50,7 +50,7 @@ namespace Umbraco.Tests.Publishing //reset the app context DataTypesResolver.Reset(); ApplicationContext.Current = null; - Resolution.IsFrozen = false; + Resolution.Unfreeze(); RepositoryResolver.Reset(); diff --git a/src/Umbraco.Tests/Resolvers/ActionsResolverTests.cs b/src/Umbraco.Tests/Resolvers/ActionsResolverTests.cs index 391b0c6072..411abc3d20 100644 --- a/src/Umbraco.Tests/Resolvers/ActionsResolverTests.cs +++ b/src/Umbraco.Tests/Resolvers/ActionsResolverTests.cs @@ -36,7 +36,7 @@ namespace Umbraco.Tests.Resolvers public void TearDown() { ActionsResolver.Reset(); - Resolution.IsFrozen = false; + Resolution.Unfreeze(); } [Test] diff --git a/src/Umbraco.Tests/Resolvers/LazyManyObjectResolverTests.cs b/src/Umbraco.Tests/Resolvers/LazyManyObjectResolverTests.cs index 977ddee355..426df9109f 100644 --- a/src/Umbraco.Tests/Resolvers/LazyManyObjectResolverTests.cs +++ b/src/Umbraco.Tests/Resolvers/LazyManyObjectResolverTests.cs @@ -21,7 +21,7 @@ namespace Umbraco.Tests.Resolvers [TearDown] public void TearDown() { - Resolution.IsFrozen = false; + Resolution.Unfreeze(); } [Test] diff --git a/src/Umbraco.Tests/Resolvers/MacroFieldEditorsResolverTests.cs b/src/Umbraco.Tests/Resolvers/MacroFieldEditorsResolverTests.cs index 5507400091..ad5992f122 100644 --- a/src/Umbraco.Tests/Resolvers/MacroFieldEditorsResolverTests.cs +++ b/src/Umbraco.Tests/Resolvers/MacroFieldEditorsResolverTests.cs @@ -3,6 +3,7 @@ using System.Linq; using System.Web.UI; using NUnit.Framework; using Umbraco.Core; +using Umbraco.Core.Macros; using Umbraco.Core.ObjectResolution; using Umbraco.Tests.TestHelpers; using umbraco.interfaces; @@ -36,7 +37,7 @@ namespace Umbraco.Tests.Resolvers public void TearDown() { MacroFieldEditorsResolver.Reset(); - Resolution.IsFrozen = false; + Resolution.Unfreeze(); PluginManager.Current.AssembliesToScan = null; } diff --git a/src/Umbraco.Tests/Resolvers/ManyObjectResolverTests.cs b/src/Umbraco.Tests/Resolvers/ManyObjectResolverTests.cs index 20f970384e..75a73f79ee 100644 --- a/src/Umbraco.Tests/Resolvers/ManyObjectResolverTests.cs +++ b/src/Umbraco.Tests/Resolvers/ManyObjectResolverTests.cs @@ -19,8 +19,8 @@ namespace Umbraco.Tests.Resolvers [TearDown] public void TearDown() - { - Resolution.IsFrozen = false; + { + Resolution.Unfreeze(); } [Test] diff --git a/src/Umbraco.Tests/Resolvers/PackageActionsResolverTests.cs b/src/Umbraco.Tests/Resolvers/PackageActionsResolverTests.cs index b7b9d0a6fe..08077a29e3 100644 --- a/src/Umbraco.Tests/Resolvers/PackageActionsResolverTests.cs +++ b/src/Umbraco.Tests/Resolvers/PackageActionsResolverTests.cs @@ -36,7 +36,7 @@ namespace Umbraco.Tests.Resolvers public void TearDown() { PackageActionsResolver.Reset(); - Resolution.IsFrozen = false; + Resolution.Unfreeze(); } /// diff --git a/src/Umbraco.Tests/TestHelpers/BaseDatabaseFactoryTest.cs b/src/Umbraco.Tests/TestHelpers/BaseDatabaseFactoryTest.cs index ec3eea2570..9d22190b64 100644 --- a/src/Umbraco.Tests/TestHelpers/BaseDatabaseFactoryTest.cs +++ b/src/Umbraco.Tests/TestHelpers/BaseDatabaseFactoryTest.cs @@ -90,7 +90,7 @@ namespace Umbraco.Tests.TestHelpers SqlCeContextGuardian.CloseBackgroundConnection(); ApplicationContext.Current = null; - Resolution.IsFrozen = false; + Resolution.Unfreeze(); RepositoryResolver.Reset(); TestHelper.CleanContentDirectories(); diff --git a/src/Umbraco.Tests/TestHelpers/BaseDatabaseTest.cs b/src/Umbraco.Tests/TestHelpers/BaseDatabaseTest.cs index 856bef3e86..05074391da 100644 --- a/src/Umbraco.Tests/TestHelpers/BaseDatabaseTest.cs +++ b/src/Umbraco.Tests/TestHelpers/BaseDatabaseTest.cs @@ -83,7 +83,7 @@ namespace Umbraco.Tests.TestHelpers //reset the app context ApplicationContext.Current = null; - Resolution.IsFrozen = false; + Resolution.Unfreeze(); RepositoryResolver.Reset(); } diff --git a/src/Umbraco.Tests/TestHelpers/BaseWebTest.cs b/src/Umbraco.Tests/TestHelpers/BaseWebTest.cs index 5e4c9700f0..2bc1d2b3f5 100644 --- a/src/Umbraco.Tests/TestHelpers/BaseWebTest.cs +++ b/src/Umbraco.Tests/TestHelpers/BaseWebTest.cs @@ -102,7 +102,7 @@ namespace Umbraco.Tests.TestHelpers ApplicationContext.Current = null; - Resolution.IsFrozen = false; + Resolution.Unfreeze(); RepositoryResolver.Reset(); TestHelper.CleanContentDirectories(); @@ -122,7 +122,7 @@ namespace Umbraco.Tests.TestHelpers //DatabaseContext.Database.Dispose(); //ApplicationContext.ApplicationCache.ClearAllCache(); //ApplicationContext.Current = null; - //Resolution.IsFrozen = false; + //Resolution.Unfreeze(); //RepositoryResolver.Reset(); //if (RequiresDbSetup) //{