1

我试图理解一个有点复杂的场景。基本上,如果我的课程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();
   }
}

如果我创建它的一个X实例Release

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

什么时候Dispose被召唤Y?是在网络请求结束时还是 x 的实例被释放时?有没有Dispose被调用?!


注意:这是一个有点复杂的示例,我的实际示例要复杂得多,并且涉及 MVC ControllerFactory 和各种其他技术,但问题很简单地归结为上述问题。

4

1 回答 1

1

通过一些实验,出现以下情况:

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

注意事项

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

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

interface IY : IDisposable

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

于 2016-10-27T10:42:14.770 回答