我试图理解一个有点复杂的场景。基本上,如果我在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
如果我创建了Release
和WindsorContainer Container;
IX x = Container.Resolve<IX>();
Container.Release(x);
的实例:
Dispose
何时{strong> Y
调用Dispose
?它是在Web请求的末尾还是x的实例发布时? {{1}}是否会被调用?!
注意:这是一个有点收敛的例子,我的实际例子要复杂得多,并且需要一个MVC ControllerFactory和其他各种技术,但这个问题可归结为上面的内容&# 39;最简单的形式。
答案 0 :(得分:1)
通过一些实验,出现以下情况:
Dispose()
将被调用Dispose
X
,则Dispose
仅为Y
在Web请求结束时调用(在Dispose
上)一次。不是在释放瞬态容器对象时<强>注意事项强>
我通过调试IDispoable
方法等来得出这个结论。我假设我调试这对它的执行方式没有任何影响。我还没有找到关于它应该如何工作的任何确凿的文件,并欢迎任何找到这个的人?
我的实现与问题中的实现略有不同,我猜想Windsor需要知道接口是否为IY
,所以interface IY : IDisposable
看起来像:
{{1}}
我没有测试这是否相关(如果它没有破坏,请不要修复它)。