Правильный способ ввести пользовательскую конфигурацию - PullRequest
0 голосов
/ 25 июня 2018

Проблема, которую нужно решить: существует список настроек, скажем:

{
   "Kind1":
     {"attr1":"val11"},
     {"attr2":"val12"},
   "Kind2":
     {"attr1":"val21"},
     {"attr2":"val22"},       
}

и потребительский класс (контроллер) в .NET Core 2.1, для доступа к Kind1 или Kind2 необходим доступ к вышеуказанной конфигурации..

Предположим, что соответствующий класс уже определен в C #:

 public class KindSetting
 {
    public string attr1{get;set;}
    public string attr2{get;set;}
 }

Теперь, каков наилучший способ внедрения конфигурации в объект-потребитель.

Есть ли способвнедрить экземпляр IConfiguration в объект-потребитель и использовать его следующим образом?:

KindSetting kindSetting =_configuration.GetValue<KindSetting>(kindSettingKey);

Есть ли лучший способ выполнить вышеуказанное требование?

Ответы [ 3 ]

0 голосов
/ 25 июня 2018

После добавления services.Configure<KindSettings> вы можете добавить конфигурацию через DI, добавив в свой конструктор.

IOptionsSnapshot<KindSettings> kindSettingsConfiguration

или

IOptions<KindSettings> kindSettingsConfiguration

Разница в том, что IOptionsSnapshot будет отражать живойизменения в вашем конфигурационном файле, в то время как IOptions предназначен для использования в одиночном режиме.

Редактировать после комментария:

Допустим, ваш файл конфигурации выглядит следующим образом:

{
  "Kind1":
    {"attr1":"val11"},
    {"attr2":"val12"},
  "Kind2":
    {"attr1":"val21"},
    {"attr2":"val22"},       
}

КомуЧтобы успешно связать это, вам понадобятся два класса конфигурации

public class Kind1Configuration
{
    public string Attr1 { get; set; }
    public string Attr2 { get; set; }
}

public class Kind2Configuration
{
    public string Attr1 { get; set; }
    public string Attr2 { get; set; }
}

. Как уже говорилось ранее, для соединения точек просто добавьте

public void ConfigureServices(IServiceCollection services)
{
    services.Configure<Kind1Configuration>(Configuration.GetSection("Kind1"));

    services.Configure<Kind2Configuration>(Configuration.GetSection("Kind2"));
}

. Чтобы использовать это в контроллере, добавьте свои IOptions вконструктор

public class TestController(IOptionsSnapshot<Kind1Configuration> kindSettingsConfiguration)
{
    Kind1Configuration configuration = kindSettingsConfiguration.Value;
}

Надеюсь, это поможет.

0 голосов
/ 27 июня 2018

Я использовал следующий подход, однако я не уверен, что будет лучшим

в методе настройки класса запуска:

            services.Configure<List<KindSetting>>(Configuration.GetSection("KindSettingList"));

и на стороне объекта потребления:

   public ConsumerController(IOptions<List<KindSetting>> kindSettingsListAccessor,...)
0 голосов
/ 25 июня 2018

В файле startup.com, в методе configureservices вы можете выполнить настройку. Пример кода ниже:

   // This method gets called by the runtime. Use this method to add services to the container.
    public void ConfigureServices(IServiceCollection services)
    {
        //Need to add following linse
        services.Configure<KindSetting>(Configuration.GetSection("Kind1"));
     }

После добавления в сервисы вы можете добавить эту конфигурацию в свой класс, как показано ниже:

public class HomeController : Controller
{

    private readonly IOptions<KindSetting> _KindSetting;

    public HomeController(IOptions<KindSetting> KindSetting)
    {
        _KindSetting = KindSetting
    }

    public void myFunction()
    {
            var mysetting = _KindSetting.Value.attr1
    }
}
...