PoolableLifestyleManager
Manages a pool of objects.
using Castle.Core.Internal;
using Castle.MicroKernel.Context;
using Castle.MicroKernel.Lifestyle.Pool;
using Castle.MicroKernel.Registration;
namespace Castle.MicroKernel.Lifestyle
{
public class PoolableLifestyleManager : AbstractLifestyleManager
{
private readonly ThreadSafeInit init = new ThreadSafeInit();
private readonly int initialSize;
private readonly int maxSize;
private IPool pool;
protected IPool Pool {
get {
if (pool == null) {
bool flag = false;
try {
flag = init.ExecuteThreadSafeOnce();
if (pool == null)
pool = CreatePool(initialSize, maxSize);
return pool;
} finally {
if (flag)
init.EndThreadSafeOnceSection();
}
}
return pool;
}
}
public PoolableLifestyleManager(int initialSize, int maxSize)
{
this.initialSize = initialSize;
this.maxSize = maxSize;
}
public override void Dispose()
{
if (pool != null)
pool.Dispose();
}
public override bool Release(object instance)
{
if (pool != null)
return pool.Release(instance);
return false;
}
public override object Resolve(CreationContext context, IReleasePolicy releasePolicy)
{
return Pool.Request(context, (CreationContext c) => PoolCreationCallback(c, releasePolicy));
}
protected IPool CreatePool(int initialSize, int maxSize)
{
if (!base.Kernel.HasComponent(typeof(IPoolFactory)))
base.Kernel.Register(Component.For<IPoolFactory>().ImplementedBy<DefaultPoolFactory>().NamedAutomatically("castle.internal-pool-factory"));
IPoolFactory poolFactory = base.Kernel.Resolve<IPoolFactory>();
return poolFactory.Create(initialSize, maxSize, base.ComponentActivator);
}
protected virtual Burden PoolCreationCallback(CreationContext context, IReleasePolicy releasePolicy)
{
Burden burden = base.CreateInstance(context, false);
Track(burden, releasePolicy);
return burden;
}
protected override void Track(Burden burden, IReleasePolicy releasePolicy)
{
burden.RequiresDecommission = true;
releasePolicy.Track(burden.Instance, burden);
}
}
}