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