在.net core 2.2中初始化设置的正确方法?

时间:2019-06-27 07:24:26

标签: asp.net .net asp.net-core .net-core asp.net-core-mvc

我创建了一个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 个答案:

答案 0 :(得分:1)

示例

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