DI011

`IServiceProvider` Injection

constructor injection of `IServiceProvider`, `IServiceScopeFactory`, or `IKeyedServiceProvider` in normal services.

Default severity: Info · Code fix: No

Why it matters

this commonly enables hidden runtime resolution and service locator behaviour.

Asking for a giant "surprise box" each time instead of a known tool means no one knows what you actually need.

README problem example

public sealed class MyService
{
    public MyService(IServiceProvider provider) { }
}

README better pattern

Yes. Adds a missing self-binding registration only when DI015 can prove a single direct constructor dependency is a concrete, non-keyed type and the registration call is local and unambiguous.

Repo sample extraction

Examples pulled from the sample app

Open full sample file

Sample app warning case

public class ServiceProviderInjectionExample
{
    private readonly IServiceProvider _provider;

    public ServiceProviderInjectionExample(IServiceProvider provider)
    {
        _provider = provider;
    }

    public void DoWork()
    {
        var service = _provider.GetService<ITransientService>();
    }
}

Sample app safe pattern

public class ExplicitDependencyExample
{
    private readonly ITransientService _service;

    public ExplicitDependencyExample(ITransientService service)
    {
        _service = service;
    }
}