Services should be disposed in the reverse order that they were created.
If service A depends on service B, B will be created first, then A. Now when Dispose()
is called on A, it could have to use B. Unfortunately B might already be disposed as the order is not deterministic and based on a dictionary entry. I suggest we enforce the disposal order to be both logical and deterministic as far as the dependency order is defined.
I have a branch that implements this in our container and adds specification tests but I have couple of concerns:
IServiceProvider
to be IDisposable
in specification but adding this tests forces it. Neither Autofac not StructureMap implementation of IServiceProvider
is IDisposable
@khellang @nblumhardt what are your thought on this?
Thanks for the loop-in! This sounds like another case where making assumptions in the framework could cause issues for some container integrations.
Reverse-order disposal is necessary to correctly tear down some component graphs, e.g. where A : IDisposable
"registers" itself with B : IDisposable
on creation, and "un-registers" on disposal, but:
If users want forward-order disposal they should be free to depend on it by selecting a container that implements it - and vice-versa. Personally, I feel reverse-order is the _right_ way to do it, but it's highly unlikely everyone agrees with me ;-)
Most helpful comment
Thanks for the loop-in! This sounds like another case where making assumptions in the framework could cause issues for some container integrations.
Reverse-order disposal is necessary to correctly tear down some component graphs, e.g. where
A : IDisposable
"registers" itself withB : IDisposable
on creation, and "un-registers" on disposal, but:If users want forward-order disposal they should be free to depend on it by selecting a container that implements it - and vice-versa. Personally, I feel reverse-order is the _right_ way to do it, but it's highly unlikely everyone agrees with me ;-)
433 is a discussion along these lines - disposal order would be a good item to add to the summary on that ticket, I think.