namespace Umbraco.Cms.Core.Scoping; /// /// Provides a base class for scope contextual objects. /// /// /// /// A scope contextual object is enlisted in the current scope context, /// if any, and released when the context exists. It must be used in a 'using' /// block, and will be released when disposed, if not part of a scope. /// /// public abstract class ScopeContextualBase : IDisposable { private bool _scoped; /// /// Gets a contextual object. /// /// The type of the object. /// A scope provider. /// A context key for the object. /// A function producing the contextual object. /// The contextual object. /// /// /// public static T? Get(ICoreScopeProvider scopeProvider, string key, Func ctor) where T : ScopeContextualBase { // no scope context = create a non-scoped object IScopeContext? scopeContext = scopeProvider.Context; if (scopeContext == null) { return ctor(false); } // create & enlist the scoped object T? w = scopeContext.Enlist( "ScopeContextualBase_" + key, () => ctor(true), (completed, item) => { item?.Release(completed); }); if (w is not null) { w._scoped = true; } return w; } /// /// /// If not scoped, then this releases the contextual object. /// public void Dispose() { if (_scoped == false) { Release(true); } } /// /// Releases the contextual object. /// /// A value indicating whether the scoped operation completed. public abstract void Release(bool completed); }