使用 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();
}
}
如果我创建 X
和 Release
的实例:
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
我还没有测试这是否相关(如果它没坏,请不要修复它)。
我正在尝试理解一个有点复杂的场景。基本上如果我有 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();
}
}
如果我创建 X
和 Release
的实例:
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
我还没有测试这是否相关(如果它没坏,请不要修复它)。