web-dev-qa-db-fra.com

Comment résoudre une instance dans ConfigureServices dans ASP.NET Core

Est-il possible de résoudre une instance de IOptions<AppSettings> de la méthode ConfigureServices dans Startup? Normalement, vous pouvez utiliser IServiceProvider pour initialiser des instances, mais vous n'en avez pas à ce stade-ci lorsque vous enregistrez des services.

public void ConfigureServices(IServiceCollection services)
{
    services.Configure<AppSettings>(
        configuration.GetConfigurationSection(nameof(AppSettings)));

    // How can I resolve IOptions<AppSettings> here?
}
60

Vous pouvez créer un fournisseur de service en utilisant la méthode BuildServiceProvider() sur le IServiceCollection:

public void ConfigureService(IServiceCollection services)
{
    // Configure the services
    services.AddTransient<IFooService, FooServiceImpl>();
    services.Configure<AppSettings>(configuration.GetSection(nameof(AppSettings)));

    // Build an intermediate service provider
    var sp = services.BuildServiceProvider();

    // Resolve the services from the service provider
    var fooService = sp.GetService<IFooService>();
    var options = sp.GetService<IOptions<AppSettings>>();
}

Vous avez besoin du Microsoft.Extensions.DependencyInjection package pour cela.


Dans le cas où il vous suffit de lier certaines options dans ConfigureServices, vous pouvez également utiliser la méthode Bind:

var appSettings = new AppSettings();
configuration.GetSection(nameof(AppSettings)).Bind(appSettings);

Cette fonctionnalité est disponible via le Microsoft.Extensions.Configuration.Binder paquet.

105
Henk Mollema

Le meilleur moyen d’instancier des classes dépendant d’autres services est d’utiliser l’option Add XXX surcharge qui vous fournit le IServiceProvider . De cette façon, vous n'avez pas besoin d'instancier un fournisseur de services intermédiaire.

Les exemples suivants montrent comment vous pouvez utiliser cette surcharge dans les méthodes AddSingleton/AddTransient .

        services.AddSingleton(serviceProvider =>
        {
            var options = serviceProvider.GetService<IOptions<AppSettings>>();
            var foo = new Foo(options);
            return foo ;
        });


        services.AddTransient(serviceProvider =>
        {
            var options = serviceProvider.GetService<IOptions<AppSettings>>();
            var bar = new Bar(options);
            return bar;
        });
7
Ehsan Mirsaeedi

Cherchez-vous quelque chose comme suit? Vous pouvez consulter mes commentaires dans le code:

// this call would new-up `AppSettings` type
services.Configure<AppSettings>(appSettings =>
{
    // bind the newed-up type with the data from the configuration section
    ConfigurationBinder.Bind(appSettings, Configuration.GetConfigurationSection(nameof(AppSettings)));

    // modify these settings if you want to
});

// your updated app settings should be available through DI now
1
Kiran Challa