スタートアップのConfigureServices
メソッドからIOptions<AppSettings>
のインスタンスを解決することは可能ですか?通常、IServiceProvider
を使用してインスタンスを初期化できますが、サービスを登録するこの段階ではそれを使用できません。
public void ConfigureServices(IServiceCollection services)
{
services.Configure<AppSettings>(
configuration.GetConfigurationSection(nameof(AppSettings)));
// How can I resolve IOptions<AppSettings> here?
}
IServiceCollection
でBuildServiceProvider()
メソッドを使用して、サービスプロバイダーを構築できます。
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>>();
}
これにはMicrosoft.Extensions.DependencyInjection
パッケージが必要です。
ConfigureServices
でいくつかのオプションをバインドするだけの場合、Bind
メソッドも使用できます。
var appSettings = new AppSettings();
configuration.GetSection(nameof(AppSettings)).Bind(appSettings);
この機能は、Microsoft.Extensions.Configuration.Binder
パッケージを通じて利用できます。
他のサービスに依存するクラスをインスタンス化する最良の方法は、Add [〜#〜] xxx [〜#〜]IServiceProviderを提供するオーバーロード。この方法では、中間サービスプロバイダーをインスタンス化する必要はありません。
次のサンプルは、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;
});
次のようなものを探していますか?コード内の私のコメントを見ることができます:
// 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