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
:
- Убедитесь, что вы зарегистрировались
Messages
вStartup.ConfigureServices(...)
(пример ниже).
services.Configure<Messages>(Configuration.GetSection("Messages"));
- Получить
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; }
}