Правильный способ инициализации настроек в .net core 2.2? - PullRequest
0 голосов
/ 27 июня 2019

Я создал приложение REST API, которое имеет множество настроек и хранится в базе данных.Эти настройки используются во время фильтрации и вставки данных в таблицу.

Поскольку мне нужно обращаться к настройкам каждый раз, когда мне нужно вставить данные.Вместо того, чтобы обращаться к настройкам из базы данных, я создал глобальный класс настроек и помещаю все настройки в этот класс.

public static class GlobalSettings
{
    public static string Setting_1;
    public static string Setting_2;
    public static string Setting_3;
    public static string Setting_4;

    public static void Initialize(ISettingsRepo repo)
    {
        try
        {
            var settings = new GSettings(repo);
            Setting_1 = settings.SetSetting_1();
            Setting_2 = settings.SetSetting_2();
            Setting_3 = settings.SetSetting_3();
            Setting_4 = settings.SetSetting_4();
        }
        catch (Exception ex)
        {
            throw new Exception("Error when loading settings.\r\n" + ex.Message);
        }
    }
}

Здесь ISettingsRepo - это служба с ограничениями, которая загружает настройки из базы данных.Функции будут инициализировать настройки для свойств.

Теперь для инициализации GlobalSettings Я использовал метод configure в классе запуска, как этот.

using (var scope = app.ApplicationServices.CreateScope())
            {
                Settings.GlobalSettings.Initialize(scope.ServiceProvider
                    .GetRequiredService<Data_Repo.Settings.ISettingsRepo>());
            }

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

Есть ли лучший способ сделать это ??

1 Ответ

1 голос
/ 27 июня 2019

Пример

Мой appsetting.json имеет такую ​​структуру.

"EmailSettings": {
  "MailServer": "",
  "MailPort": ,
  "Email": "",
  "Password": "",
  "SenderName": "",
  "Sender": "",
  "SysAdminEmail": ""
},

Я определю свой класс следующим образом

public class EmailSettings
{
  public string MailServer { get; set; }
  public int MailPort { get; set; }
  public string SenderName { get; set; }
  public string Sender { get; set; }
  public string Email { get; set; }
  public string Password { get; set; }
  public string SysAdminEmail { get; set; }
}

Итак, у нас есть структура config. Последнее, что нам нужно, это зарегистрироваться в Startup.cs

services.Configure<EmailSettings>(configuration.GetSection("EmailSettings"));

Для использования внутри класса обслуживания

private readonly IOptions<EmailSettings> _emailSetting;

public EmailSender(IOptions<EmailSettings> emailSetting)
{
  _emailSetting = emailSetting;
}

email.From.Add(new MailboxAddress(_emailSetting.Value.SenderName, _emailSetting.Value.Sender));
...