<PackageReference Include="Castle.Windsor" Version="3.2.1" />

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