Виндзор: Как я могу заставить виндзор утилизировать временный компонент, если он не отслеживает жизненный цикл компонента? - PullRequest
2 голосов
/ 04 июня 2010

Мы используем 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?

1 Ответ

3 голосов
/ 04 июня 2010

Нет, вы не можете съесть свой торт и съесть его тоже. Вы можете реализовать свою собственную пользовательскую политику, которая похожа на NoTrackingReleasePolicy, но будет отслеживать некоторые компоненты ...

...