Проблема с инжектированием строго типизированной настройки конфигурации в ядре dot net

Как описано в этой ошибке на Facebook, вы также можете запросить конкретные размеры изображений теперь с помощью нового синтаксиса API [ field ].

Например:

https://graph.facebook.com/____OBJECT_ID____?fields=picture.type(large)

0
задан error_handler 13 July 2018 в 08:22
поделиться

2 ответа

Я нашел способ решить проблему, с которой я столкнулся. Здесь мне помогло использование рефлекса.

Ниже приведено решение

var type= typeof(MyConfigPath);
var t = Activator.CreateInstance(type);
PropertyInfo propertyInfo = type.GetProperty("Value");
var configValue = configuration.GetValue<string>($"AppSettings:{type.Name}");
if (!string.IsNullOrEmpty(configValue) && propertyInfo != null)
{
  propertyInfo.SetValue(t, configValue, null);
}
services.AddSingleton(type, t);

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

Я получил эту идею с некоторыми R & amp; D и некоторое обсуждение с моей командой.

0
ответ дан error_handler 17 August 2018 в 13:32
поделиться

Прежде всего, если вы используете метод .Configure, вы не будете вводить MyConfigPath, но IOptions<MyConfigPath> (посмотрите еще на свою первую ссылку). Таким образом, ваша инъекция становится примерно такой:

public MyClass(IOptions<MyConfigPath> myConfigPathOptions)

Во-вторых, configuration.GetSection предназначен для доступа к целому разделу, а не только к строке. Если вы хотите напрямую получить доступ к «MyConfigPath» из JSON, вы можете использовать configuration["AppSettings:MyConfigPath"]. Вы можете использовать GetSection как configuration.GetSection("AppSettings"), чтобы получить все настройки приложения в целом.

Предлагаю вам ознакомиться с документацией для IConfiguration и IOptions

Я предполагаю, что вы действительно пытаетесь сделать что-то например:

У вас есть класс для всех ваших настроек:

public class MyAppSettings {
    public string MyConfigPath {get; set;} 
    public int MyOtherSetting { get; set; } // sample of how you could have more
}

Json для вышеупомянутого с добавленным «MyOtherSetting» будет выглядеть примерно так:

{
    "AppSettings": {
        "MyConfigPath": "C:\\EmployeeUpload",
        "MyOtherSetting" : 501
    }
}

В вашем классе запуска вы можете использовать это:

services.Configure<MyAppSettings>(configuration.GetSection("AppSettings")

Теперь для инъекций вам нужно будет использовать что-то вроде этого:

MyClass(IOptions<MyAppSettings> settingOptions)
{            
    _myConfigPath = myConfigPath.Value.MyConfigPath;
}
1
ответ дан Neville Nazerane 17 August 2018 в 13:32
поделиться
  • 1
    Спасибо @Neville Nazerane, на самом деле я не могу изменить конструктор MyClass. Он должен оставаться таким, какой он есть. Я могу получить доступ к значениям ключей конфигурации, предоставив такой ключ: «AppSettings: MyConfigPath». Он работает на самом деле. – error_handler 13 July 2018 в 07:45
  • 2
    вы имеете в виду, что ваша инъекция работает? вы нашли myConfigPath.Value равным нулю? – Neville Nazerane 13 July 2018 в 07:53
  • 3
    в любом случае, используя services.AddSingleton, вы должны поддерживать свою структуру – Neville Nazerane 13 July 2018 в 07:57
  • 4
    да, инъекция работает, а myConfigPath.Value - null. здесь Значение - это свойство абстрактного класса ConfigurationSetting. – error_handler 13 July 2018 в 08:12
  • 5
    Я хочу здесь, чтобы: myConfigPath.Value не должен быть нулевым. Он должен быть назначен из конфигурации с впрыском от запуска. – error_handler 13 July 2018 в 08:33
Другие вопросы по тегам:

Похожие вопросы: