#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
файле.