在ASP.NET Core中,JSON文件和配置之间的关系令人沮丧。我设定了一个秘密:
dotnet user-secrets set "Pwd" "123"
似乎没有办法通过IConfiguration.GetSection
方法检索,只能使用IConfiguration.GetValue
,我需要使用IConfiguration.GetSection
将值与POCO对象绑定:
public class AppSecrets
{
public int Pwd { get; set; }
}
然后我添加了另一个秘密:"parent:pwd" "456"
看看自动生成的JSON文件,它看起来像一个有两个键的常规JSON:
{
"Pwd": "123",
"parent:pwd": "456"
}
那么是什么让冒号对于.NET Core中的配置特别呢。在文档中他们提到:
在前面的示例中,冒号表示Movies是一个对象具有ServiceApiKey属性的文字。
但在我的示例中,尽管parent
没有按名称映射到AppSecrets类,但还是检索到了该值。
还有一点让我沮丧,那就是将值传递给项目属性中的应用程序参数的方式,类似于这样:
--user:data:year 1991
我们能传递更多的层次节点吗?
很抱歉我的沮丧让你沮丧。我只是在贬低.NET核心!
考虑smtp设置的poco类:
public class SmtpOptions
{
public string Server { get; set; }
public int Port { get; set; } = 25;
public string User { get; set; }
public string Password { get; set; }
public string DefaultEmailFromAddress { get; set; }
}
您可以将其放入appsettings.json中,如下所示:
{
"SmtpOptions": {
"Server": "MyServer",
"Port": "25",
"User": "MyUser",
"Password": "MyPassword",
"DefaultEmailFromAddress": "noreply@mydomain"
}
}
像这样注册它,现在poco可以在任何地方注入。
services.Configure<SmtpOptions>(configuration.GetSection("SmtpOptions"));
如果你想在用户机密中做到这一点,你需要多个命令和冒号语法,如下所示:
dotnet user-secrets set "SmtpOptions:Server" "MyServer"
dotnet user-secrets set "SmtpOptions:Port" "25"
dotnet user-secrets set "SmtpOptions:User" "MyUser"
dotnet user-secrets set "SmtpOptions:Password" "MyPassword"
dotnet user-secrets set "SmtpOptions:DefaultEmailFromAddress" "noreply@mydomain"
冒号以命令行中可能的方式表达层次结构,因此可以使用语法设置用户机密或环境变量,从而创建与json相同的层次结构。