使用 PerWebRequest 组件的瞬态组件,PerWebRequest 组件何时超出范围?

Transient component using a PerWebRequest component, when does the PerWebRequest component go out of scope?

我正在尝试理解一个有点复杂的场景。基本上如果我有 class X 在 Castle 中注册为 LifestyleTransient():

Component.For<IX>()
.ImplementedBy<X>()
.LifestyleTransient()

X 看起来像:

public X : IX
{
    private IY _y;
    public X(IY y)
    {
        _y = y;
    }
    ....
}

Y是这样注册的:

Component.For<IY>()
.ImplementedBy<Y>()
.LifestylePerWebRequest()

看起来像:

public Y : IY, IDisposable
{
    private Object obj;
    public Y()
    {
       obj = new Object();
    }  

   public void Dispose()
   {
      obj.Dispose();
   }
}

如果我创建 XRelease 的实例:

WindsorContainer Container;
IX x = Container.Resolve<IX>();
Container.Release(x);

Dispose 什么时候在 Y 上被调用?是在web请求结束的时候还是x的实例被释放的时候? Dispose 会被调用吗?!


注意:这是一个有点复杂的例子,我的实际例子要复杂得多,涉及 MVC ControllerFactory 和其他各种技术,但问题可以归结为以上是最简单的形式。

经过一些实验,以下是正确的:

  • Dispose() 会被调用
  • Dispose 在网络请求结束时被调用
  • 如果创建和释放多个瞬态X,则Dispose仅 在 Web 请求结束时调用(在 Y 上)一次。不是在释放临时容器对象时

注意事项

我通过调试 Dispose 方法等得出了这个结论。我假设我调试它不会对其执行方式产生任何影响。我还没有找到关于它应该如何工作的任何结论性文档,欢迎任何找到它的人?

我的实现与问题中的略有不同,我猜想 Windsor 需要知道接口是否是 IDispoable,所以 IY 看起来像:

interface IY : IDisposable

我还没有测试这是否相关(如果它没坏,请不要修复它)。