using System; using System.Threading; namespace Umbraco.Core.ObjectResolution { /// /// Represents the status of objects resolution. /// /// /// 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 static class Resolution { private static readonly ReaderWriterLockSlim _lock = new ReaderWriterLockSlim(); /// /// Occurs when resolution is frozen. /// /// Occurs only once, since resolution can be frozen only once. public static event EventHandler Frozen; /// /// Gets or sets a value indicating whether resolution of objects is frozen. /// public static bool IsFrozen { get; private set; } public static void EnsureIsFrozen() { if (!IsFrozen) throw new InvalidOperationException("Resolution is not frozen, it is not yet possible to get values from it."); } /// /// Returns a disposable object that represents safe access to unfrozen resolution configuration. /// /// Should be used in a using(Resolution.Configuration) { ... } mode. public static IDisposable Configuration { 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; } } /// /// Freezes resolution. /// /// resolution is already frozen. public static void Freeze() { if (Resolution.IsFrozen) throw new InvalidOperationException("Resolution is frozen. It is not possible to freeze it again."); IsFrozen = true; if (Frozen != null) Frozen(null, null); } /// /// Resets resolution, ie unfreezes it and clears Frozen event. /// /// To be used in unit tests. internal static void Reset() { IsFrozen = false; Frozen = null; } } }