ASP.NET Coreのすべてのバージョンでこれを実現する最も簡単で最も正しい方法は、IConfigureOptions<TOptions>インターフェイスを実装することです。これは.NET Core 1.0から存在しますが、Just Work™の仕組みについて知っている人はほとんどいないようです。
例として、アプリケーションの他のサービスの1つに依存するカスタムモデルバリデーターを追加するとします。最初は不可能のようです-にIMyServiceDependencyアクセスできないため、解決する方法はありませんIServiceProvider。
public class MyModelValidatorProvider : IModelValidatorProvider
{
    public MyModelValidatorProvider(IMyServiceDependency dependency)
    {
        ...
    }
}
public void ConfigureServices(IServiceCollection services)
{
    services.AddControllers(options =>
    {
        options.ModelValidatorProviders.Add(new MyModelValidatorProvider(??????));
    });
}
しかし、「魔法」IConfigureOptions<TOptions>はそれをとても簡単にします:
public class MyMvcOptions : IConfigureOptions<MvcOptions>
{
    private IMyServiceDependency _dependency;
    public MyMvcOptions(IMyServiceDependency dependency)
        => _dependency = dependency;
    public void Configure(MvcOptions options)
    {
        options.ModelValidatorProviders.Add(new MyModelValidatorProvider(_dependency));
    }
}
public void ConfigureServices(IServiceCollection services)
{
    // or scoped, or transient
    services.AddSingleton<IConfigureOptions<MvcOptions>, MyMvcOptions>();
    services.AddControllers();
}
基本的に、Add***(***Options)デリゲートで行っていた設定はすべてConfigureServices、IConfigureOptions<TOptions>クラスのConfigureメソッドに移動されます。次に、他のサービスを登録するのと同じ方法でオプションを登録します。
詳細と、これが舞台裏でどのように機能するかについての情報については、常に優れたAndrew Lockeを紹介します。