Проблема с настройками значений Keyvaluepair

c# #.net #asp.net-core

#c# #.net #asp.net-ядро

Вопрос:

Это мои настройки приложений

   {
    "Messages": {
        "ApiUrl": "demo",   
        "ApiKey": {
          "Key": "key",
          "Value": "1234"
        }
    }
  }
 

Класс модели:

 public class CPSSettings
{
    public Messages Messages { get; set; } = null!;  
}
public class Messages
{
    public string ApiUrl { get; set; } = null!;
    public KeyValuePair<string?, string?> ApiKey{ get; set; }
} 
       
 

Я не получаю значения для _settings.Messages.ApiKey.Key и _settings.Messages.ApiKey.Value

Но получение значения для ApiUrl . У меня проблема с KeyValuePair, не получающим значение

 public testClient(IOptions<CPSSettings> options)
{  
    _settings = options.Value;
}

//...

if (_settings.Messages.ApiKey.Key is not null 
    amp;amp; _settings.Messages.ApiKey.Value is not null)
{
    var s = _settings.Messages.ApiKey.Key;    // am getting null vaues in both
    var s1 = _settings.Messages.ApiKey.Value
}
 

Комментарии:

1. Ваш код кажется запутанным. В вашем файле настроек есть ApiKey ; в вашем Messages классе есть UserId ; но код, который обращается к нему, есть ApiKey .

2. Я не вижу, где вы определяете и назначаете настройки. Можете ли вы опубликовать это, пожалуйста?

3. @RichardDeeming сори, я обновлен .. я удалил некоторые коды в классе … пожалуйста, проверьте обновленный вопрос

4. @Ajt Члены KeyValuePair доступны только для чтения . Фреймворк не может установить эти значения после инициализации структуры

5. @Ajt используйте другой тип объекта, которым вы управляете. который имеет изменяемые члены

Ответ №1:

Члены KeyValuePair доступны только для чтения. Фреймворк не может установить эти значения после инициализации структуры

Я бы посоветовал вам использовать другой тип объекта, который вы контролируете. Тот, который имеет изменяемые элементы.

Например

 public class CPSSettings {
    public Messages Messages { get; set; } = null!;  
}

public class Messages {
    public string ApiUrl { get; set; } = null!;
    public ApiKey ApiKey{ get; set; } //<-- NOTE THE CHANGE
} 

public class ApiKey {
    public string? Key { get; set; }
    public string? Value { get; set; }
}
 

Таким образом, при привязке настроек фреймворк может инициализировать и правильно устанавливать значения элементов

Ответ №2:

Удаление CPSSettings упростило бы сценарий. Смотрите ниже, как получить доступ к значениям конфигурации с помощью шаблона параметров в .NET, используя Messages :

  1. Убедитесь, что вы зарегистрировались Messages в Startup.ConfigureServices(...) (пример ниже).
 services.Configure<Messages>(Configuration.GetSection("Messages"));
 
  1. Получить IOptions<Messages> в качестве testClient параметра конструктора (пример ниже).
 public testClient(IOptions<Messages> options)
{
    _settings = options.Value;
}
 

Комментарии:

1. я обновил вопрос … на самом деле keyvaluepair показывает значение null

2. @Ajt, я обновил ответ, чтобы рассмотреть дополнительные детали вопроса.

Ответ №3:

Члены KeyValuePair доступны только для чтения. Вы можете использовать его, но вам придется выполнить некоторое преобразование. Я не думаю, что вам это действительно нужно. Поэтому я создал другой класс, чтобы заменить его. Также вы должны использовать класс Messages для десериализации настроек. Класс CPSSettings — это ошибка, она вам не нужна. Итак, попробуйте этот код, он был протестирован в Visual Studio.

 var cpsSettingsSection = configuration.GetSection("Messages");
var cpsSettings = cpsSettingsSection.Get<Messages>();

var url = cpsSettings.ApiUrl;
var key = cpsSettings.ApiKey.Key.Dump();    
var value = cpsSettings.ApiKey.Value.Dump();

//services.Configure<Messages>(cpsSettingsSection);

public class Messages
{
    public string ApiUrl { get; set; }
    public KeyValueString ApiKey {get; set;}
 }

public class KeyValueString
{
    public string Key { get; set; }
    public string Value { get; set; }
}