Лучший способ получить доступ к значениям appsetting в сервисах - PullRequest
0 голосов
/ 03 мая 2018

В моем решении (.NET Core 2.0) у меня есть проект WebApi и проект Services из библиотеки классов. Я хочу получить доступ к значениям в файле appsettings.json моего проекта WebApi в одном из моих сервисов. Например, в этом разделе.

"ThirdPartyApi":
{
    "ApiUrl": "xxx",
    "ApiVersion": "xxx",
    "ApiNamespace": "xxx",
    "ApiKey": "xxx",
    "Client": "xxx",
    "ClientVersion": "xxx"
}

Из того, что я видел, я могу сделать это двумя способами:

  1. Внедрите IConfiguration _config в мою службу и получите доступ к следующим значениям:

    _config["ThirdPartyApi:ApiUrl"]
    
  2. Создайте класс ThirdPartyApiSettings со свойствами, сопоставленными с разделом настроек следующим образом:

    services.Configure<ThirdPartyApiSettings(Configuration.GetSection("ThirdPartyApi"));
    

    и введите IOptions<ThirdPartyApiSettings> _apiSettings в мой класс обслуживания и получите доступ к настройкам через свойства класса следующим образом:

    _apiSettings.ApiUrl
    

Итак, есть ли предпочтительный путь между ними? Или конкретные случаи использования, когда нужно выбрать один из этих методов над другим?

1 Ответ

0 голосов
/ 03 мая 2018

Инъекция IConfiguration - это анти-паттерн. Вы должны создать строго типизированный класс и внедрить его вместо этого. Как отметил @Steven в комментариях, IOptions<T> является излишним, но есть смысл вводить IOptionsSnapshot<T>, так как это будет отвечать на перезагрузки конфигурации. Вы также можете получить лучшее из обоих миров и зарегистрировать свой строго типизированный экземпляр класса как функцию IOptionsSnapshot<T>, чтобы можно было внедрить что-то вроде ThirdPartyApi, но при этом получать обновления конфигурации:

services.Configure<ThirdPartyApi>(Configuration.GetSection("ThirdPartyApi"));
services.AddTransient(p => p.GetRequiredService<IOptionsSnapshot<ThirdPartyApi>>().Value);

Просто имейте в виду, что при таком подходе настройки будут ограничены объектом, в который они вводятся. Например, если вы внедрите в одиночный файл, они фактически никогда не будут перезагружены, потому что обновление произойдет только во время внедрения. Если вы хотите убедиться, что вы всегда используете самую последнюю конфигурацию, вы должны вводить IOptionsSnapshot<T> напрямую и обращаться к атрибуту Value каждый раз, чтобы получить значения конфигурации.

...