Загрузка разных частей конфигурации при каждом запросе

У меня есть приложение, в котором я хотел бы загружать различные разделы конфигурации на основе заголовка, поступающего из запроса. Это часть моего public void ConfigureServices (IServiceCollection services) {services.AddControllers ();

        IConfiguration cfg = null;
        services.AddScoped<IConfiguration>(x =>
        {
            cfg = Configuration.GetSection("AppSettings:" + x.GetService<IHttpContextAccessor>()?.HttpContext?.Request?.Headers["xxx"]);
            return (cfg);
        });

        services.AddSingleton<DB.Calendar.Repo>(x => new DB.Calendar.Repo(cfg));
        services.AddApplicationInsightsTelemetry();
    }

Проблема в том, что внутри лямбда AddScoped ничего не вызывается (даже если я просто поставил console.outs), поэтому cfg остается нулевым. Что я делаю неправильно


person americanslon    schedule 01.11.2019    source источник


Ответы (1)


Делегат, переданный в services.AddScoped(), выполняется только при создании новой области (т. Е. В начале HTTP-запроса для приложений ASP.NET). Это объясняет, почему cfg равно null при вызове AddSingleton().

Примерно так должно работать:

services.AddScoped<DB.Calendar.Repo>(x => {
    var cfg = Configuration.GetSection("AppSettings:" + x.GetService<IHttpContextAccessor>()?.HttpContext?.Request?.Headers["xxx"]);
    return new DB.Calendar.Repo(cfg);
});

Как только он заработает, было бы разумно переместить логику, которая считывает правильный раздел конфигурации, в свой собственный сервис, чтобы сделать его более тестируемым (а также чтобы он выглядел чистым).

person galdin    schedule 01.11.2019
comment
Вот и все. Так просто. У меня чуть не случился инсульт, когда я это понял. В ASP Core не все так однозначно, исходя из платформы OG .net. - person americanslon; 01.11.2019
comment
@americanslon - это лишь вопрос времени, пока вы не освоитесь. Это довольно последовательно во всем. - person galdin; 01.11.2019