使用PerWebRequest组件的瞬态组件,PerWebRequest组件什么时候超出范围?

时间:2016-10-27 09:42:20

标签: c# inversion-of-control castle-windsor castle-windsor-3

我试图理解一个有点复杂的场景。基本上,如果我在Castle中注册了X 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

如果我创建了ReleaseWindsorContainer Container; IX x = Container.Resolve<IX>(); Container.Release(x); 的实例:

Dispose

何时{strong> Y 调用Dispose?它是在Web请求的末尾还是x的实例发布时? {{1}}是否会被调用?!

注意:这是一个有点收敛的例子,我的实际例子要复杂得多,并且需要一个MVC ControllerFactory和其他各种技术,但这个问题可归结为上面的内容&# 39;最简单的形式。

1 个答案:

答案 0 :(得分:1)

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

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

<强>注意事项

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

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

{{1}}

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