2015-08-06 13 views
17

È possibile risolvere un'istanza di IOptions<AppSettings> dal metodo ConfigureServices in Avvio? Normalmente puoi usare IServiceProvider per inizializzare le istanze ma non ce l'hai in questa fase quando registri i servizi.Come risolvere l'istanza all'interno di ConfigureServices in ASP.NET Core

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

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

risposta

26

si può costruire un provider di servizi utilizzando il metodo BuildServiceProvider() sul 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>>(); 
} 

è necessario il pacchetto Microsoft.Extensions.DependencyInjection per questo.


Nel caso in cui non vi resta che legare alcune opzioni in ConfigureServices, è anche possibile utilizzare il metodo Bind:

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

Questa funzionalità è disponibile tramite il pacchetto Microsoft.Extensions.Configuration.Binder.

+0

E se fosse necessario risolvere questo servizio in un'altra parte dell'applicazione? Sono sicuro che non è tutto fatto in ConfigureServices() giusto? – Ray

+0

@Ray, quindi è possibile utilizzare i meccanismi di iniezione delle dipendenze predefiniti come l'iniezione del costruttore. Questa domanda riguarda specificamente la risoluzione dei servizi all'interno del metodo 'ConfigureServices'. –

1

Stai cercando qualcosa come seguire? Si può dare un'occhiata a miei commenti nel codice:

// 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 
Problemi correlati