DI014

Root Service Provider Not Disposed

root providers from `BuildServiceProvider()` that are never disposed, including local providers whose only manual disposal is conditional, catch-only, after reassignment to another provider, or after repeated creation inside a loop.

Default severity: Warning · Code fix: Yes

Why it matters

singleton disposables at root scope may never be cleaned up.

Locking the front door but leaving all the taps running still wastes the whole house.

README problem example

var services = new ServiceCollection();
var provider = services.BuildServiceProvider();
var service = provider.GetRequiredService<IMyService>();

README better pattern

using var provider = services.BuildServiceProvider();
var service = provider.GetRequiredService<IMyService>();

Yes. Adds disposal pattern for simple local declarations with no existing manual disposal code. Conditional or otherwise partial manual-disposal flows stay diagnostic-only so the ownership rewrite remains deliberate.

Repo sample extraction

Examples pulled from the sample app

Open full sample file

Sample app warning case

    public void BadExample()
    {
        var services = new ServiceCollection();
        
        // ⚠️ BAD: Root provider is not disposed
        // Disposable singletons will not be disposed
        var provider = services.BuildServiceProvider();
        
        var service = provider.GetService<IServiceScopeFactory>();
    }

Sample app safe pattern

    public void GoodExample()
    {
        var services = new ServiceCollection();

        // ✅ GOOD: Provider disposed via 'using'
        using var provider = services.BuildServiceProvider();
        
        var service = provider.GetService<IServiceScopeFactory>();
    }