DI004

Service Used After Scope Disposed

using a service after the scope that produced it has already ended, including services resolved through provider aliases, scoped collections from `GetServices<T>()` enumerated after disposal, explicit `Dispose()` / `DisposeAsync()`, scopes disposed later via `using (scope)`, and the same patterns inside constructors, accessors, local functions, lambdas, and anonymous methods.

Default severity: Warning · Code fix: Yes

Why it matters

leads to runtime disposal errors and brittle service behaviour.

It is like trying to turn on a torch after you removed the batteries.

README problem example

IMyService service;
using (var scope = _scopeFactory.CreateScope())
{
    service = scope.ServiceProvider.GetRequiredService<IMyService>();
}
service.DoWork();

README better pattern

using (var scope = _scopeFactory.CreateScope())
{
    var service = scope.ServiceProvider.GetRequiredService<IMyService>();
    service.DoWork();
}

Yes. Moves simple immediate invocation-style uses back into the owning scope only when the diagnostic local was assigned in that scope, or adds a narrow pragma suppression for context-dependent cases.

Repo sample extraction

Examples pulled from the sample app

Open full sample file

Sample app warning case

    public void Bad_UseAfterDispose()
    {
        IScopedService service;
        using (var scope = _scopeFactory.CreateScope())
        {
            service = scope.ServiceProvider.GetRequiredService<IScopedService>();
        }
        // DI004: Service 'service' may be used after its scope is disposed
        service.DoWork();
    }

Sample app safe pattern

    public void Good_UsedWithinScope()
    {
        using (var scope = _scopeFactory.CreateScope())
        {
            var service = scope.ServiceProvider.GetRequiredService<IScopedService>();
            service.DoWork(); // Within scope - OK
        }
    }