developer tip

ASP.NET Core에서 ConfigureServices 내 인스턴스를 확인하는 방법

copycodes 2020. 11. 24. 08:07
반응형

ASP.NET Core에서 ConfigureServices 내 인스턴스를 확인하는 방법


Startup IOptions<AppSettings>ConfigureServices메서드에서 의 인스턴스를 해결할 수 있습니까? 일반적으로 IServiceProvider인스턴스를 초기화 하는 사용할 수 있지만 서비스를 등록 할 때이 단계에서 사용할 수 없습니다.

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

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

에 대한 BuildServiceProvider()방법을 사용하여 서비스 공급자를 구축 할 수 있습니다 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>>();
}

Microsoft.Extensions.DependencyInjection이를위한 패키지 가 필요합니다 .


에서 일부 옵션을 바인딩해야하는 ConfigureServices경우 다음 Bind메서드 를 사용할 수도 있습니다 .

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

이 기능은 Microsoft.Extensions.Configuration.Binder패키지를 통해 사용할 수 있습니다 .


다른 서비스에 종속 된 클래스를 인스턴스화하는 가장 좋은 방법 IServiceProvider 를 제공 하는 Add XXX 오버로드를 사용하는 것입니다 . 이렇게하면 중간 서비스 공급자를 인스턴스화 할 필요가 없습니다.

다음 샘플은 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

참고 URL : https://stackoverflow.com/questions/31863981/how-to-resolve-instance-inside-configureservices-in-asp-net-core

반응형