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?
}
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.
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;
});
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