我想弄清楚一个有点复杂的场景。基本上,如果我有类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);何时在Y?上调用Dispose它是在web请求的末尾还是在x的实例被释放的时候?Dispose接到电话了吗?!
注:--这是一个有点转换的例子,我的实际示例要复杂得多,并且喜欢使用MVC ControllerFactory和其他各种技术,但这个问题可以用它最简单的形式归结到上面。
发布于 2016-10-27 10:42:14
经过一些试验,如下所示是正确的:
Dispose()将被呼叫Dispose。X,则Dispose仅在web请求结束时(在Y上)调用一次。当瞬态容器对象被释放时不会。警告
通过调试Dispose方法等,我得出了这个结论。我假设我正在调试它,这并没有对它的性能产生任何影响。我还没有找到任何结论性的文件,这应该是如何运作,并会欢迎任何人发现这一点?
我的实现与问题中的实现略有不同,我猜温莎需要知道接口是否为IDispoable,因此IY看起来如下:
interface IY : IDisposable我还没有测试这是否相关(如果它没有损坏,就不要修复它)。
https://stackoverflow.com/questions/40281262
复制相似问题