AbstractProxyFactory
using Castle.Core;
using Castle.Core.Interceptor;
using Castle.DynamicProxy;
using Castle.MicroKernel;
using Castle.MicroKernel.Context;
using Castle.MicroKernel.Proxy;
using Castle.MicroKernel.Resolvers;
using System;
using System.Collections.Generic;
using System.Linq;
namespace Castle.Windsor.Proxy
{
public abstract class AbstractProxyFactory : IProxyFactory
{
private List<IModelInterceptorsSelector> selectors;
public abstract object Create(IKernel kernel, object instance, ComponentModel model, CreationContext context, params object[] constructorArguments);
public abstract object Create(IProxyFactoryExtension customFactory, IKernel kernel, ComponentModel model, CreationContext context, params object[] constructorArguments);
public abstract bool RequiresTargetInstance(IKernel kernel, ComponentModel model);
public void AddInterceptorSelector(IModelInterceptorsSelector selector)
{
if (selectors == null)
selectors = new List<IModelInterceptorsSelector>();
selectors.Add(selector);
}
public bool ShouldCreateProxy(ComponentModel model)
{
if (model.HasInterceptors)
return true;
ProxyOptions proxyOptions = model.ObtainProxyOptions(false);
if (proxyOptions != null && proxyOptions.RequiresProxy)
return true;
if (selectors != null && selectors.Any((IModelInterceptorsSelector s) => s.HasInterceptors(model)))
return true;
return false;
}
protected IEnumerable<InterceptorReference> GetInterceptorsFor(ComponentModel model)
{
InterceptorReference[] array = model.Interceptors.ToArray();
if (selectors != null) {
foreach (IModelInterceptorsSelector selector in selectors) {
if (selector.HasInterceptors(model)) {
array = selector.SelectInterceptors(model, array);
if (array == null)
array = new InterceptorReference[0];
}
}
return array;
}
return array;
}
protected IInterceptor[] ObtainInterceptors(IKernel kernel, ComponentModel model, CreationContext context)
{
List<IInterceptor> list = new List<IInterceptor>();
foreach (InterceptorReference item in GetInterceptorsFor(model)) {
try {
IInterceptor val = ((IReference<IInterceptor>)item).Resolve(kernel, context);
SetOnBehalfAware(val as IOnBehalfAware, model);
list.Add(val);
} catch (Exception ex) {
foreach (IInterceptor item2 in list) {
kernel.ReleaseComponent(item2);
}
if (ex is InvalidCastException)
throw new DependencyResolverException($"""{model.Name}""{typeof(IInterceptor).get_Name()}""");
throw;
}
}
return list.ToArray();
}
protected static void SetOnBehalfAware(IOnBehalfAware onBehalfAware, ComponentModel target)
{
onBehalfAware?.SetInterceptedComponentModel(target);
}
}
}