如何在.Net 5中从appsettings.jsonMap多个级别的设置(ASP.NET)

bf1o4zei  于 2023-11-20  发布在  .NET
关注(0)|答案(2)|浏览(116)

我正在将一个Asp.Net MVC应用程序迁移到.Net5。我有一个静态类,用作web.NET中设置的外观。我的Setting类公开了静态属性,每个类都表示设置组,例如:

public static class MySettings
{
    public static class MainDB
    {
        public static string ConnectionString
        {
            get
            {
                // Code to retrieve the actual values
                return "";
            }
        }
    }

    public static class ExternalApi
    {
        public static string Uri
        {
            get
            { // Code to retrieve the actual values
                return "";
            }
        }
    }

    public static class OtherSettings
    {
        // ...
    }
}

字符串
在.Net Core 5中(实际上,从.Net Core 2开始),我们使用POCO的tyo read设置,如https://learn.microsoft.com/en-us/aspnet/core/fundamentals/configuration/options?view=aspnetcore-5.0中所示
有没有办法将我的所有设置Map到一个对象,例如,对于appsettings.json:

{
  "Logging": {
    "LogLevel": {
      "Default": "Information",
      "Microsoft": "Warning",
      "Microsoft.Hosting.Lifetime": "Information"
    }
  },
  "AllowedHosts": "*",
  "Settings": {
    "MainDB": {
      "ConnectionString": "whatever needed to access the db"
    },
    "ExtrenaAPI" {
      "Uri": "https://whatever.api.com",
      "Key": "mysupersecretkey",
      "Secret": "mysupersecret-uh-secret"
    }
  }
}


职业:

public class MainDB
{
    public string ConnectionString { get; set; }
}

public class ExternalApi
{
    public string Uri { get; set; }
    public string Key { get; set; }
    public string Secret { get; set; }
}

public class Settings
{
    public MainDB MainDB { get; set; }

    `public ExternalApi ExternalApi { get; set; }
}


配置(在Startup.cs中):

services.Configure<Settings>(Configuration.GetSection("Settings"));


(Yes,我知道我可以做services.Configure<MainDB>(Configuration.GetSection("Settings:MainDB"));services.Configure<ExternalApi>(Configuration.GetSection("Settings:ExternalApi"));,但我想在一个单一的对象,如果可能的所有设置。
有什么建议吗?

u0njafvf

u0njafvf1#

我假设你在这里谈论的是绑定(应用程序设置文件到一个单一的对象?)如果你对一些额外的代码没有意见,那么这可以为你想要实现的目标工作。

IConfigurationRoot configRoot = new ConfigurationBuilder().AddJsonFile("appsettings.json").Build();
Settings settingsRoot = new Settings(); // custom POCO with appsettings structure
((IConfiguration)configRoot).Bind(settingsRoot);

public class Settings
{
    public Logging Logging { get; set; }

    public string AllowedHosts { get; set; }
}
public class LogLevel
{
    public string Default { get; set; }
    public string Microsoft { get; set; }
}

字符串
如果您只想设置单个节点/节的层次结构,您可以简单地执行((IConfiguration)config.GetSection("SectionName")).Bind(myObject)
无论哪种方式,config.Bind(object)都是这里的神奇位。

7kqas0il

7kqas0il2#

IConfiguration Configuration * 是你对appsettings的外观(实际上,是对所有设置的外观,无论它们是来自应用程序设置、用户机密还是其他地方)。

var configurationSection = Configuration.GetSection("Settings")

字符串
然后可能将其作为MySettings类中的私有静态变量-但这似乎是多余的。

相关问题