首页 > 解决方案 > 在 .net core 2.2 中初始化设置的正确方法?

问题描述

我创建了一个 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我在启动类中使用了配置方法,就像这样。

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

现在我可以在控制器或我的 api 中的任何地方使用它,并在不访问数据库的情况下获取设置。GlobalSettings如果设置更新,我也可以随时重新加载。但是这种方法是否正确或有内存泄漏问题?

有没有更好的方法来做到这一点。?

标签: c#asp.net-core.net-coreasp.net-core-mvcasp.net-core-2.2

解决方案


例子

我的 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; }
}

所以我们有了配置结构。我们需要的最后一件事是在 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));

推荐阅读