Как отменить исправление элемента раздела конфигурации?

#c# #dependency-injection #configuration

#c# #внедрение зависимостей #конфигурация

Вопрос:

Чтобы настроить мои службы, мне нужно установить singleton по экземпляру следующим образом:

         IConfigurationSection settingsSection = Configuration.GetSection("AppSettings");
        MySettings settings = new MySettings();
        settingsSection.Bind(settings);

        // something to do with the instance, so I need it here

        services.Configure<MySettings>(settings);
 

Когда я проверяю settingsSection элементы, я вижу, что все его ключи имеют префикс Appsettings: (т.е.: AppSettings:AppId , AppSettings:AppUrl , …).

Таким образом, привязка не выполняется, и мой settings объект не инициализируется.

Есть ли способ предотвратить этот префикс, поскольку я уже знаю, что нахожусь в этом разделе?

Вот как выглядит appsettings.json:

 {
  "AppSettings": {
    "AppId": 3540350,
    "AppUrl": "http://localhost:542",
    "AppEnabled": true,
    ...
  }
}
 

Вот как выглядит класс MySettings:

 public class MySettings
{
    public int AppId { get; set;}
    public string AppUrl { get; set;}
    public bool AppEnabled { get; set;}
    ...
}
 

Редактировать

Я тупо сохранил старое соглашение об именах, которое нельзя десериализовать (я думаю):

 {
  "AppSettings": {
    "App.Id": 3540350,
    "App.Url": "http://localhost:542",
    "App.Enabled": true,
    ...
  }
}
 

Этот вопрос можно закрыть.

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

1. Существует метод расширения, который получает раздел и настраивает IOptions его, поэтому вам нужно будет только сделать что-то вроде services.Configure<MySettings>(Configuration.GetSection("AppSettings"))

2. @dcg «Мне нужно установить синглтон по экземпляру»

Ответ №1:

Если вы хотите settings быть одноэлементным, я думаю, вы могли бы использовать метод расширения Get IConfigurationSection , что-то вроде этого:

 var settings = configuration.GetSection("AppSettings").Get<MySettings>();
services.AddSingleton(settings);
 

Изображение примера запущенного веб-проекта:

введите описание изображения здесь

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

1. Уже пробовал, в разделе есть нужные элементы, но экземпляр не инициализирован. Я думаю, это потому, что инъекция еще не завершена.

2. Хм, я уверен, что я делал это раньше и работал так, как предполагалось.

3. Кстати, AppId это целое число, но в конфигурации это строка.

4. @sinsedrix Я только что воспроизвел это в примере веб-проекта, и он работает. Я создал представление с подробными MySettings сведениями об экземпляре, введенном в HomeController , и он отображает значения в appsettings.json файле.