避免 ASP.NET Core Program.cs 中的静态值
Avoid static value in ASP.NET Core Program.cs
在我的 CreateWebHostBuilder() 方法中,我添加了 AWS Systems Manager Parameter Store 作为配置生成器的附加源:
public class Program
{
public static void Main(string[] args)
{
CreateWebHostBuilder(args).Build().Run();
}
public static IWebHostBuilder CreateWebHostBuilder(string[] args)
{
return WebHost.CreateDefaultBuilder(args)
.ConfigureAppConfiguration(builder =>
{
builder.AddSystemsManager("/ConfigureStoreName/");
})
.UseStartup<Startup>();
}
}
而不是硬编码 "/ConfigureStoreName/" 我想让它成为一个配置值。
当我调用 .ConfigureAppConfiguration()
时,我是否可以访问 .CreateDefaultBuilder()
使用的 appsettings.json 中的配置值?如果是这样,我将如何更新我的代码来调用它?如果不是,避免在 CreateWebHostBuilder()
方法中使用静态值的最佳方法是什么?
使用该信息预加载设置文件。
如果例如设置文件包含
{
//...
"AWS": {
"Profile": "local-test-profile",
"Region": "us-west-2",
"ConfigureSource": {
"Path": "/ConfigureStoreName/"
}
}
//...
}
在配置中加载它以提取值。
public static IWebHostBuilder CreateWebHostBuilder(string[] args) {
var configuration = new ConfigurationBuilder()
.AddJsonFile("appsettings.json") //<-- or whichever file has that information
.Build();
string path = configuration.GetValue<string>("AWS:ConfigureSource:Path");
//Or a strongly typed model with aws options
return WebHost.CreateDefaultBuilder(args)
.ConfigureAppConfiguration(builder =>
{
builder.AddSystemsManager(path);
})
.UseStartup<Startup>();
}
我最终采用的解决方案是使用环境变量:
public class Program
{
private static string _parameterStoreNamePath;
public static void Main(string[] args)
{
_parameterStoreNamePath = Environment.GetEnvironmentVariable("AWS_PARAMETER_STORE_NAME");
CreateWebHostBuilder(args).Build().Run();
}
public static IWebHostBuilder CreateWebHostBuilder(string[] args)
{
return WebHost.CreateDefaultBuilder(args)
.ConfigureAppConfiguration(builder =>
{
builder.AddSystemsManager(_parameterStoreNamePath);
})
.UseStartup<Startup>();
}
}
备注:
- 在 Visual Studio 项目中,创建一个名为 AWS_PARAMETER_STORE_NAME 的环境变量。
- 对于已部署的实例,AWS_PARAMETER_STORE_NAME需要在serverless.template中设置或通过控制台直接添加到Lambda。
在我的 CreateWebHostBuilder() 方法中,我添加了 AWS Systems Manager Parameter Store 作为配置生成器的附加源:
public class Program
{
public static void Main(string[] args)
{
CreateWebHostBuilder(args).Build().Run();
}
public static IWebHostBuilder CreateWebHostBuilder(string[] args)
{
return WebHost.CreateDefaultBuilder(args)
.ConfigureAppConfiguration(builder =>
{
builder.AddSystemsManager("/ConfigureStoreName/");
})
.UseStartup<Startup>();
}
}
而不是硬编码 "/ConfigureStoreName/" 我想让它成为一个配置值。
当我调用 .ConfigureAppConfiguration()
时,我是否可以访问 .CreateDefaultBuilder()
使用的 appsettings.json 中的配置值?如果是这样,我将如何更新我的代码来调用它?如果不是,避免在 CreateWebHostBuilder()
方法中使用静态值的最佳方法是什么?
使用该信息预加载设置文件。
如果例如设置文件包含
{
//...
"AWS": {
"Profile": "local-test-profile",
"Region": "us-west-2",
"ConfigureSource": {
"Path": "/ConfigureStoreName/"
}
}
//...
}
在配置中加载它以提取值。
public static IWebHostBuilder CreateWebHostBuilder(string[] args) {
var configuration = new ConfigurationBuilder()
.AddJsonFile("appsettings.json") //<-- or whichever file has that information
.Build();
string path = configuration.GetValue<string>("AWS:ConfigureSource:Path");
//Or a strongly typed model with aws options
return WebHost.CreateDefaultBuilder(args)
.ConfigureAppConfiguration(builder =>
{
builder.AddSystemsManager(path);
})
.UseStartup<Startup>();
}
我最终采用的解决方案是使用环境变量:
public class Program
{
private static string _parameterStoreNamePath;
public static void Main(string[] args)
{
_parameterStoreNamePath = Environment.GetEnvironmentVariable("AWS_PARAMETER_STORE_NAME");
CreateWebHostBuilder(args).Build().Run();
}
public static IWebHostBuilder CreateWebHostBuilder(string[] args)
{
return WebHost.CreateDefaultBuilder(args)
.ConfigureAppConfiguration(builder =>
{
builder.AddSystemsManager(_parameterStoreNamePath);
})
.UseStartup<Startup>();
}
}
备注:
- 在 Visual Studio 项目中,创建一个名为 AWS_PARAMETER_STORE_NAME 的环境变量。
- 对于已部署的实例,AWS_PARAMETER_STORE_NAME需要在serverless.template中设置或通过控制台直接添加到Lambda。