了解ASP.NET核心配置中的冒号吗



在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相同的层次结构。

最新更新