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

ComponentLifecycleExtension

using System.Collections.Generic; namespace Castle.MicroKernel.Handlers { public class ComponentLifecycleExtension : IResolveExtension { private class Releasing { private readonly IKernel kernel; private readonly List<ComponentReleasingDelegate> releasers; public Releasing(int count, IKernel kernel) { this.kernel = kernel; releasers = new List<ComponentReleasingDelegate>(count); } public void Add(ComponentReleasingDelegate releaser) { releasers.Add(releaser); } public void Invoked(Burden burden) { burden.Releasing -= Invoked; releasers.ForEach(delegate(ComponentReleasingDelegate r) { r(kernel); }); } } private readonly List<ComponentResolvingDelegate> resolvers = new List<ComponentResolvingDelegate>(4); private IKernel kernel; public void AddHandler(ComponentResolvingDelegate handler) { resolvers.Add(handler); } public void Init(IKernel kernel, IHandler handler) { this.kernel = kernel; } public void Intercept(ResolveInvocation invocation) { Releasing releasing = null; if (resolvers.Count > 0) { foreach (ComponentResolvingDelegate resolver in resolvers) { ComponentReleasingDelegate componentReleasingDelegate = resolver(kernel, invocation.Context); if (componentReleasingDelegate != null) { if (releasing == null) { releasing = new Releasing(resolvers.Count, kernel); invocation.RequireDecommission(); } releasing.Add(componentReleasingDelegate); } } } invocation.Proceed(); if (releasing != null) { Burden burden = invocation.Burden; if (burden != null) burden.Releasing += releasing.Invoked; } } } }