using System; using System.Threading; namespace Umbraco.Core.ObjectResolution { /// /// base class for resolvers which declare a singleton accessor /// /// internal abstract class ResolverBase where TResolver : class { static TResolver _resolver; /// /// The lock for the singleton /// /// /// Though resharper says this is in error, it is actually correct. We want a different lock object for each generic type. /// See this for details: http://confluence.jetbrains.net/display/ReSharper/Static+field+in+generic+type /// static readonly ReaderWriterLockSlim ResolversLock = new ReaderWriterLockSlim(); public static TResolver Current { get { using (new ReadLock(ResolversLock)) { if (_resolver == null) throw new InvalidOperationException("Current has not been initialized. You must initialize Current before trying to read it."); return _resolver; } } set { using (new WriteLock(ResolversLock)) { if (value == null) throw new ArgumentNullException("value"); if (_resolver != null) throw new InvalidOperationException("Current has already been initialized. It is not possible to re-initialize Current once it has been initialized."); _resolver = value; } } } /// /// used in unit tests to reset current to null /// internal static void Reset() { _resolver = null; } } }