Как читать appsettings.json с массивом значений - PullRequest
0 голосов
/ 14 февраля 2019

У меня есть следующий файл appSettings.json:

  "SundrySettings": {

    "CookieName": "Cookie",

    "AccessGroup": "Software Development",

    "Terminals" :  {
      "Raucherplatz" : "tablet1.local",
      "Service" :      "tablet2.local",  
      "Technik" :      "tablet3.local",  
      "Technik" :      "tablet4.local",  
      "Container" :    "tablet5.local"
    }
  }
}

, который я хотел бы загрузить в следующую структуру:


    public class Terminal
    {
        public string Name;
        public string Description;
    }

    public class SundryOptions
    {
        public string CookieName { get; set; } = "dummy";
        public string HRAccessGroup { get; set; } = "dummy";
        public List<Terminal> Terminals;
    }

, которую я бы попытался загрузить, используя следующуюкоманды:

ServiceProvider sp = services.BuildServiceProvider();
SundryOptions sundryOptions = sp.GetService<IOptions<SundryOptions>>().Value;

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

Я предполагаю, что у меня есть какая-то ошибка в классе -> Я был бы рад любым указателям.

Ответы [ 3 ]

0 голосов
/ 14 февраля 2019

Выполните следующие действия:

var cookieName = Configuration.GetSection("SundrySettings:CookieName").Value;
var accessGroup = Configuration.GetSection("SundrySettings:AccessGroup").Value;
var terminals = Configuration.GetSection("SundrySettings:Terminals").GetChildren();

List<Terminal>  terminalList = new List<Terminal>();

foreach (var keyValuePair in terminals)
{
     Terminal termial = new Terminal()
     {
          Name = keyValuePair.Key,
          Description = keyValuePair.Value
     };

     terminalList.Add(termial);
}

SundryOptions sundryOption = new SundryOptions()
{
            CookieName = cookieName,
            HRAccessGroup = accessGroup,
            Terminals = terminalList
};

Я проверил точную конфигурацию, которую вы указали, и она отлично работает.

0 голосов
/ 14 февраля 2019

Если Terminals - это список, в ваших appSettings это должен быть массив, а не объект.

  "Terminals" :  [
  "Raucherplatz" : "tablet1.local",
  "Service" :      "tablet2.local",  
  "Technik" :      "tablet3.local",  
  "Technik" :      "tablet4.local",  
  "Container" :    "tablet5.local"
]
0 голосов
/ 14 февраля 2019

Реализовать обработку конфигурации следующим образом где-то примерно так:

var cookieName = 
Configuration.GetSection("SundrySettings:CookieName").Value;
var accessGroup = Configuration.GetSection("SundrySettings:AccessGroup").Value;

var terminals = new List<Terminal>()

var terminalSections = this.Configuration.GetSection("Terminals").GetChildren();
foreach (var item in terminalSections)
{
    terminals.Add(new Terminal 
    {
           // perform type mapping here 
    });
}

SundryOptions sundryOption = new SundryOptions()
{
        CookieName = cookieName,
        HRAccessGroup = accessGroup,
        Terminals = terminalList
};

Конечно, может быть более короткая версия, но вы можете начать отсюда.

...