Мы используем NoTrackingReleasePolicy в контейнере Windsor из-за утечек памяти, которые возникают, когда мы не освобождаем наши компоненты после использования. Теперь рассмотрим следующую проблему.
Некоторые одноразовые компоненты:
public class DisposableComponent : IDisposable
{
private bool _disposed;
public bool Disposed
{
get { return _disposed; }
}
public void Dispose()
{
_disposed = true;
GC.SuppressFinalize(this);
}
}
Некоторые классы, использующие одноразовый компонент:
public class ClassWithReferenceToDisposableService
{
private DisposableComponent _disposableComponent;
public ClassWithReferenceToDisposableService(DisposableComponent disposableComponent)
{
_disposableComponent = disposableComponent;
}
}
И, наконец, тест, который настраивает эти компоненты как временные и разрешает / разрешает их:
[Test]
public void ReleaseComponent_ServiceWithReferenceToTransientDisposable_TransientComponentDisposed()
{
// arrange
var windsorContainer = new WindsorContainer();
windsorContainer.Kernel.ReleasePolicy = new NoTrackingReleasePolicy();
windsorContainer.Register(Component.For<ClassWithReferenceToDisposableService>().LifeStyle.Transient);
windsorContainer.Register(Component.For<DisposableComponent>().LifeStyle.Transient);
ClassWithReferenceToDisposableService service =
windsorContainer.Resolve<ClassWithReferenceToDisposableService>();
// act
windsorContainer.Release(service);
}
Теперь, если я удалю NoTrackingReleasePolicy, Windsor будет распоряжаться временной службой, как и ожидалось, но я не могу этого сделать (точка). Теперь я хочу добиться того, чтобы Windsor располагал временные компоненты (где угодно в графе разрешений), когда я вызываю ReleaseCompnent. Есть ли способ добиться этого без изменения NoTrackingReleasePolicy?