<PackageReference Include="Castle.Windsor" Version="4.1.1" />

ScopedLifestyleManager

using Castle.Core.Internal; using Castle.MicroKernel.Context; using Castle.MicroKernel.Lifestyle.Scoped; using System; using System.Threading; namespace Castle.MicroKernel.Lifestyle { public class ScopedLifestyleManager : AbstractLifestyleManager { private IScopeAccessor accessor; public ScopedLifestyleManager() : this(new LifetimeScopeAccessor()) { } public ScopedLifestyleManager(IScopeAccessor accessor) { this.accessor = accessor; } public override void Dispose() { Interlocked.Exchange(ref accessor, null)?.Dispose(); } public override object Resolve(CreationContext context, IReleasePolicy releasePolicy) { return GetScope(context).GetCachedInstance(base.Model, delegate(Action<Burden> afterCreated) { Burden burden = base.CreateInstance(context, true); afterCreated(burden); Track(burden, releasePolicy); return burden; }).Instance; } private ILifetimeScope GetScope(CreationContext context) { IScopeAccessor scopeAccessor = accessor; if (scopeAccessor == null) throw new ObjectDisposedException("Scope was already disposed. This is most likely a bug in the calling code."); ILifetimeScope scope = scopeAccessor.GetScope(context); if (scope == null) throw new ComponentResolutionException($"""{base.Model.Name}""{typeof(IScopeAccessor).ToCSharpString()}""", base.Model); return scope; } } }