Загрузка разных частей конфигурации каждый запрос - PullRequest
0 голосов
/ 01 ноября 2019

У меня есть приложение, в которое я хотел бы загружать различные разделы конфигурации на основе заголовка, полученного из запроса. Вот часть моего startup.cs 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 остается нулевым. Что я делаю не так

1 Ответ

1 голос
/ 01 ноября 2019

Делегат, переданный на 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);
});

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...