-
Notifications
You must be signed in to change notification settings - Fork 3
Description
Simple Injector allows framework dependencies to be resolved (cross wired) by making use of the .AddSimpleInjector
and .UseSimpleInjector
extension methods. This allows the following:
using (AsyncScopedLifestyle.BeginScope(container))
{
var sc = container.GetInstance<IServiceScope>();
sc.ServiceProvider.GetService<SomeScoped>();
}
In this case, the framework's IServiceScope
is internally created and cached by the Simple Injector scope and when the Simple Injector scope is disposed of, so will the IServiceScope
be with its SomeScoped
registation.
But now consider the following example where an already-existing IServiceScope
is provided:
using (AsyncScopedLifestyle.BeginScope(container))
{
container.GetInstance<ServiceScopeProvider>().ServiceScope = serviceScope;
var sc = container.GetInstance<IServiceScope>();
Assert.AreSame(serviceScope, sc);
sc.ServiceProvider.GetService<SomeScoped>();
}
In this case the resolved IServiceScope
is the externally provided instance. With the v5.3 integration, however, with the disposal of the Simple Injector scope, that externally provided IServiceScope
with its SomeScoped
registration are disposed as well.
This last, however, is an error. Since that IServiceScope
is externally provided, it is not created by Simple Injector, and Simple Injector should, threrefore, not dispose of it.
This is important, because even though the Simple Injector scope is disposed, the IServiceScope
might live on for some time and there might be code that uses some scoped, disposable framework dependency. Such dependency would break.
In the latter case, the externally provided IServiceScope should not be disposed of.