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

ExtendedHandler

using Castle.Core; using Castle.MicroKernel.Context; using System.Collections.Generic; using System.Linq; namespace Castle.MicroKernel.Handlers { public class ExtendedHandler : DefaultHandler { private readonly IReleaseExtension[] releaseExtensions; private readonly IResolveExtension[] resolveExtensions; public ExtendedHandler(ComponentModel model, ICollection<IResolveExtension> resolveExtensions, ICollection<IReleaseExtension> releaseExtensions) : base(model) { if (resolveExtensions != null) this.resolveExtensions = resolveExtensions.ToArray(); if (releaseExtensions != null) this.releaseExtensions = releaseExtensions.ToArray(); } public override void Init(IKernelInternal kernel) { base.Init(kernel); if (resolveExtensions != null) { IResolveExtension[] array = resolveExtensions; foreach (IResolveExtension resolveExtension in array) { resolveExtension.Init(kernel, this); } } if (releaseExtensions != null) { IReleaseExtension[] array2 = releaseExtensions; foreach (IReleaseExtension releaseExtension in array2) { releaseExtension.Init(kernel, this); } } } public override bool Release(Burden burden) { if (releaseExtensions == null) return base.Release(burden); ReleaseInvocation releaseInvocation = new ReleaseInvocation(burden); InvokeReleasePipeline(0, releaseInvocation); return releaseInvocation.ReturnValue; } protected override object Resolve(CreationContext context, bool instanceRequired) { if (resolveExtensions == null) return base.Resolve(context, instanceRequired); ResolveInvocation resolveInvocation = new ResolveInvocation(context, instanceRequired); InvokeResolvePipeline(0, resolveInvocation); return resolveInvocation.ResolvedInstance; } private void InvokeReleasePipeline(int extensionIndex, ReleaseInvocation invocation) { if (extensionIndex >= releaseExtensions.Length) invocation.ReturnValue = base.Release(invocation.Burden); else { int nextIndex = extensionIndex + 1; invocation.SetProceedDelegate(delegate { InvokeReleasePipeline(nextIndex, invocation); }); releaseExtensions[extensionIndex].Intercept(invocation); } } private void InvokeResolvePipeline(int extensionIndex, ResolveInvocation invocation) { if (extensionIndex >= resolveExtensions.Length) { invocation.ResolvedInstance = ResolveCore(invocation.Context, invocation.DecommissionRequired, invocation.InstanceRequired, out Burden burden); invocation.Burden = burden; } else { int nextIndex = extensionIndex + 1; invocation.SetProceedDelegate(delegate { InvokeResolvePipeline(nextIndex, invocation); }); resolveExtensions[extensionIndex].Intercept(invocation); } } } }