Windsor:在不跟踪组件生命周期时,如何让windsor处理瞬态组件?

时间:2010-06-04 06:53:00

标签: castle-windsor

我们在Windsor容器上使用NoTrackingReleasePolicy,因为我们在使用后不释放组件时会发生内存泄漏。现在考虑以下问题。

一些一次性部件:

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 个答案:

答案 0 :(得分:3)

不,你不能吃蛋糕也不能吃。 您可以实现自己的自定义策略,类似于NoTrackingReleasePolicy,但会跟踪某些组件......