I'm trying to make sense of a somewhat complicated scenario. Basically if I have class X that is registered in Castle as LifestyleTransient():
Component.For<IX>()
.ImplementedBy<X>()
.LifestyleTransient()
X looks something like:
public X : IX
{
private IY _y;
public X(IY y)
{
_y = y;
}
....
}
and Y is registered thus:
Component.For<IY>()
.ImplementedBy<Y>()
.LifestylePerWebRequest()
and looks like:
public Y : IY, IDisposable
{
private Object obj;
public Y()
{
obj = new Object();
}
public void Dispose()
{
obj.Dispose();
}
}
If I create an instance of X and Release it:
WindsorContainer Container;
IX x = Container.Resolve<IX>();
Container.Release(x);
when does Dispose get called on Y? Is it at the end of the web request or when the instance of x is released? Does Dispose get called at all?!
Note: This is a somewhat converluted example, my actual example is much more complicated and invloves an MVC ControllerFactory and various other pieces of technology, but the question pretty boils down to the above in it's simpliest form.
With a bit of experimentation is appears the following is true:
Dispose()will get calledDisposeis called at the end of the web requestXs are created and releasedDisposeis only called (onY) once at the end of the web request. Not when the transient container objects are releasedCaveats
I've came to this conclusion by debugging the
Disposemethod, etc. I'm presuming me debugging this hasn't made any affect on how this performs. I haven't found any conclusive documentation on how this is supposed to work and would welcome anyone that does find this?My implementation was slightly different to that in the question, I guessed that Windsor would need to know if the interface was
IDispoableor not, soIYlooks like:I haven't tested if this is relevant (if it aint broke, don't fix it).