【问题标题】:Windsor: How can I make windsor dispose a transient component when not tracking component lifecycle?Windsor:在不跟踪组件生命周期的情况下,如何让 Windsor 处理瞬态组件?
【发布时间】:2010-06-04 06:52:59
【问题描述】:

我们在 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 将按预期处置临时服务,但我不能这样做(期间)。现在,我想要实现的是,当我调用 ReleaseCompnent 时,Windsor 会处理瞬态组件(解析图中的任何位置)。有什么方法可以在不更改 NoTrackingReleasePolicy 的情况下实现这一目标?

【问题讨论】:

    标签: castle-windsor


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-10-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多