我扩展了这个场景,以便还可以管理(可选的)用户机密(来自包:Microsoft.Extensions.Configuration.UserSecrets
):
IConfiguration configuration = new ConfigurationBuilder()
.SetBasePath(Directory.GetCurrentDirectory())
.AddJsonFile("appsettings.json", optional: false, reloadOnChange: true)
.AddUserSecrets(Assembly.GetEntryAssembly(),optional:true);
.Build();
添加Json文件和用户密钥的顺序很重要。请参见
调用AddJsonFile和AddUserSecrets。
我完全同意这不是首选方式(而应该使用
IOptions<>
和
依赖注入(Dependency Injection)
,并让应用程序配置库)。但我提到这个是因为我正在处理一个(非常老的)读取
app.config (xml) 的库。这个库无法从应用程序中进行配置,而是直接进行配置(期望在app.config中提供值)。现在这个库用于Full Framework、.NET Core和.NET5(或更新)应用程序。所以我也必须支持
appsettings.json。实际上无法以一种使应用程序能够向库提供必要配置值的方式来适应库。因此我添加了对JSON的支持(暂时如此——以后我们可以花费更多精力来使其可由应用程序进行配置)
最后我还支持
环境(environments),我的代码看起来像这样:
var builder = new ConfigurationBuilder()
.SetBasePath(Directory.GetCurrentDirectory())
.AddJsonFile("appsettings.json", optional: true, reloadOnChange: false);
var environment = Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT");
if (!string.IsNullOrEmpty(environment))
{
builder = builder.AddJsonFile(string.Format("appsettings.{0}.json", environment), optional: true, reloadOnChange: false);
if (string.Equals(environment, "Development", StringComparison.CurrentCultureIgnoreCase))
{
builder = builder.AddUserSecrets(Assembly.GetEntryAssembly(),optional:true);
}
}
请注意,我决定仅为“开发”范围管理“用户机密”。
configurationBuilder.Configure<MySettingsClas>()
),但是实际读取配置信息的工作应该留给主应用程序来完成。 - Panagiotis Kanavos