2015-08-06 15 views
17

Ist es möglich, eine Instanz von IOptions<AppSettings> von der -Methode im Startup aufzulösen? Normalerweise können Sie IServiceProvider verwenden, um Instanzen zu initialisieren, aber Sie haben es in diesem Stadium nicht, wenn Sie Dienste registrieren.So lösen Sie die Instanz innerhalb von ConfigureServices in ASP.NET Core

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

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

Antwort

26

Sie können einen Service-Provider bauen mit der BuildServiceProvider() Methode auf dem 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>>(); 
} 

Sie benötigen die Microsoft.Extensions.DependencyInjection Paket für diese.


In dem Fall, dass Sie einige Optionen in ConfigureServices brauchen nur zu binden, können Sie auch die Bind Methode verwenden:

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

Diese Funktionalität durch das Microsoft.Extensions.Configuration.Binder Paket zur Verfügung steht.

+0

Was ist, wenn Sie diesen Dienst in einem anderen Teil der Anwendung auflösen müssen? Ich bin sicher, es ist nicht alles in ConfigureServices() fertig, oder? – Ray

+0

@Ray dann können Sie die Standardabhängigkeit Injektion Mechanismen wie Konstruktor Injektion verwenden. Diese Frage bezieht sich speziell auf das Auflösen von Diensten innerhalb der ConfigureServices-Methode. –

1

Suchen Sie etwas wie folgt? Sie können auf meine Kommentare im Code einen Blick:

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