web-dev-qa-db-ja.com

ASP.NET CoreのConfigureServices内のインスタンスを解決する方法

スタートアップのConfigureServicesメソッドからIOptions<AppSettings>のインスタンスを解決することは可能ですか?通常、IServiceProviderを使用してインスタンスを初期化できますが、サービスを登録するこの段階ではそれを使用できません。

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

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

IServiceCollectionBuildServiceProvider()メソッドを使用して、サービスプロバイダーを構築できます。

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パッケージを通じて利用できます。

105
Henk Mollema

他のサービスに依存するクラスをインスタンス化する最良の方法は、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;
        });
7
Ehsan Mirsaeedi

次のようなものを探していますか?コード内の私のコメントを見ることができます:

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