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;
}
}
}
}