public class CustomProxyFactory : AbstractProxyFactory
{
protected static readonly IInternalLogger log = LoggerProvider.LoggerFor(typeof (CustomProxyFactory));
private static readonly DefaultProxyBuilder proxyBuilder = new DefaultProxyBuilder();
private readonly INHibernateActivator activator;
public CustomProxyFactory(INHibernateActivator activator)
{
this.activator = activator;
}
public override INHibernateProxy GetProxy(object id, ISessionImplementor session)
{
try
{
var proxyType = IsClassProxy
? proxyBuilder.CreateClassProxyType(
PersistentClass,
Interfaces,
ProxyGenerationOptions.Default)
: proxyBuilder.CreateInterfaceProxyTypeWithoutTarget(
Interfaces[0],
Interfaces,
ProxyGenerationOptions.Default);
var proxy = activator.Instantiate(proxyType);
var initializer = new LazyInitializer(EntityName, PersistentClass, id, GetIdentifierMethod, SetIdentifierMethod,
ComponentIdType, session);
SetInterceptors(proxy, initializer);
initializer._constructed = true;
return (INHibernateProxy) proxy;
}
catch (Exception e)
{
log.Error("Creating a proxy instance failed", e);
throw new HibernateException("Creating a proxy instance failed", e);
}
}
public override object GetFieldInterceptionProxy()
{
var proxyGenerationOptions = new ProxyGenerationOptions();
var interceptor = new LazyFieldInterceptor();
proxyGenerationOptions.AddMixinInstance(interceptor);
var proxyType = proxyBuilder.CreateClassProxyType(PersistentClass, Interfaces, proxyGenerationOptions);
var proxy = activator.Instantiate(proxyType);
SetInterceptors(proxy, interceptor);
SetMixin(proxy, interceptor);
return proxy;
}
private void SetInterceptors(object proxy, params IInterceptor[] interceptors)
{
var field = proxy.GetType().GetField("__interceptors");
field.SetValue(proxy, interceptors);
}
private void SetMixin(object proxy, LazyFieldInterceptor interceptor)
{
var fields = proxy.GetType().GetFields(BindingFlags.Public | BindingFlags.Instance);
var mixin = fields.Where(f => f.Name.StartsWith("__mixin")).Single();
mixin.SetValue(proxy, interceptor);
}
}