Является ли запятая решающим фактором между словарем и объектом? - PullRequest
0 голосов
/ 09 мая 2020

В настоящее время я пишу службу API, которая использует функцию привязки из пространства имен Microsoft.Extensions.Configuration.Binder. Сейчас все работает, но у меня возник вопрос, как это сделать. У меня довольно простой базовый класс:

public class GracefulTimeoutConfigOptions
{
    public  Dictionary<string,GracefulTimeoutOptions> GracefulTimeoutOptions { get; set; }
}

json для этого выглядит примерно так:

{
  "AppSettings": {
    "Environment": "DEV",
    "gracefulTimeoutOptions": {
      "Base": {
        "name": "Base",
        "maxTimeOut": 45000,
        "maxItems": 40,
        "timeoutMatchingString": "Processing Request has timed out",
        "processingSteps": {
          "totalOverHead": {
            "name": "TotalOverHead", //Caps IS IMPORTANT + this is REQUIRED step name to have in your base.
            "constantValue": 150,
            "scalingValuePerItem": 0,
            "excluded": true
          }
        }
      }
    },
  }
}

Обратите внимание на запятую, которую я добавил в конце, потому что без Это. Привязка к этому контракту не выполняется ... несмотря на совпадение содержимого с:

public class GracefulTimeoutOptions
{ 
    public string Name { get; set; }
    public int MaxTimeOut { get; set; }
    public int MaxItems { get; set; }
    public string TimeoutMatchingString { get; set; }
    public Dictionary<string, ProcessingStepOptions> ProcessingSteps { get; set; }

}

Похоже, что секция конфигурации является только допустимым словарем (согласно связывателю / десериализатору), если есть более одного элемента внутри. Почему это так, это связано с какой-то спецификацией JSON? Это предназначено? Есть ли другой класс для использования, где может быть более одного элемента, но не всегда? Сразу после этого я предполагаю, что есть какое-то различие между объектом и словарем с одним элементом, который сделан внутренним, о котором я не знаю. Это уже работает, и больше нет проблем. Мне просто интересно, почему это сработало.

...