Передача данных из массива конфигурации json через внедрение зависимостей не работает в asp.net core 2

Используя ASP.Net Core 2, я не могу передавать данные конфигурации, хранящиеся в массиве JSON, через DI. В ASP.NET Core 1.1 мой подход работает безупречно. Я уже читал документацию MS, касающуюся DI и опций в версии 2, но, похоже, ничего не изменилось.

Отлаживая приложение с помощью Visual Studio, я могу подтвердить, что объект Configuration содержит данные из JsonConfigurationProvider. Но каким-то образом связывание не удается, и внедренный экземпляр IOptionsSnapshot.Value.FaqDataList всегда равен нулю.

Что мне не хватает? Любая помощь будет высоко оценен. Большое спасибо!

faq.json:

{
 "faqData": [
   {
    "Question": "Title1",
    "Answer": "Text1"
   },
   ...more items
 ]
}

Program.cs:

public static IWebHost BuildWebHost(string[] args) =>
        WebHost.CreateDefaultBuilder(args)
        .UseStartup<Startup>()
        .ConfigureAppConfiguration((hostingContext, config) => {
            var env = hostingContext.HostingEnvironment;
            config.AddJsonFile("faq.json", optional: false, reloadOnChange: true);
        })
        .Build();

POCO-классы:

public class FaqData {
    public List<FaqDataItem> FaqDataList { get; set; }
}

public class FaqDataItem {
    public string Question { get; set; }
    public string Answer { get; set; }
}

Startup.cs:

public void ConfigureServices(IServiceCollection services) {
        services.Configure<FaqData>(Configuration);
        // Doesn't work either:
        // services.Configure<FaqData>(Configuration.GetSection("faqData"));
        services.AddMvc();
}
1
0
481
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Ваш JSON недействителен:

"faqData": {
"FaqDataList": [
  {
    "Question": "Title1",
    "Answer": "Text1"
  }
]

}

У вас есть свойство FaqDataList, которое представляет собой список FaqDataItem.

И я не совсем понимаю, можно ли пойти с

services.Configure<FaqData>(Configuration);

но

services.Configure<FaqData>(Configuration.GetSection("faqData"));

должно сработать

Спасибо, Гвозден. Недействительный JSON был виноват. Теперь он работает, как ожидалось. :]

jonas2k 11.04.2018 12:08

Другие вопросы по теме