Lio*_*ion 1 c# json appsettings asp.net-core
在ASP.NET Core 的早期版本中,我们可以动态添加带有环境后缀的 appsetting.json 文件,就像appsettings.Production.json生产环境一样。
由于结构有点不同,看来配置现在已加载到 class 中Program。但是我们这里没有注入``,所以我自己使用环境变量尝试了:
public class Program {
public static void Main(string[] args) {
CreateWebHostBuilder(args).Build().Run();
}
public static IWebHostBuilder CreateWebHostBuilder(string[] args) {
string envName = Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT");
string envConfigFile = $"appsettings.{envName}.json";
var config = new ConfigurationBuilder()
.SetBasePath(Directory.GetCurrentDirectory())
.AddJsonFile(envConfigFile, optional: true);
var finalConfig = config.Build();
return WebHost.CreateDefaultBuilder(args)
.UseUrls("http://0.0.0.0:5000")
.UseConfiguration(finalConfig)
.UseStartup<Startup>();
}
}
Run Code Online (Sandbox Code Playgroud)
代码已执行,但它不会覆盖我的appsettings.json配置。假设我有以下内容appsettings.json:
{
"MyConnectionString": "Server=xxx,Database=xxx, ..."
}
Run Code Online (Sandbox Code Playgroud)
这个连接字符串正在工作。现在我创建appsettings.Development.json
{
"MyConnectionString": ""
}
Run Code Online (Sandbox Code Playgroud)
并设置ASPNETCORE_ENVIRONMENT=Development. 这肯定会引发异常。但应用程序可以使用来自 的 ConnectionString 正确启动appsettings.json。
根据ASP.NET Core 2 配置更改,该WebHost.CreateDefaultBuilder方法本身应使用新ConfigureAppConfiguration方法并默认加载特定于环境的配置。官方文档也说是appsettings.{Environment}.json自动加载的。但这不起作用,并且像这样手动加载也不能解决问题:
return WebHost.CreateDefaultBuilder(args)
.UseUrls("http://0.0.0.0:5000")
.ConfigureAppConfiguration((builderContext, config) => {
IHostingEnvironment env = builderContext.HostingEnvironment;
config.AddJsonFile("appsettings.json", optional: false, reloadOnChange: true)
.AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true, reloadOnChange: true);
})
.UseStartup<Startup>();
Run Code Online (Sandbox Code Playgroud)
如何使用"appsettings.{envName}.json"模式覆盖配置?我喜欢这个,因为它可以很方便地覆盖 ASP.NET Core 中的 env 特定内容。
发现我有一个用于DesignTimeDbContextFactory迁移的自定义类:
public class DesignTimeDbContextFactory : IDesignTimeDbContextFactory<ApplicationDbContext> {
public ApplicationDbContext CreateDbContext(string[] args) {
var builder = new DbContextOptionsBuilder<ApplicationDbContext>();
string connectionString = Config.GetConnectionString("AppDbContext");
builder.UseMySql(connectionString);
return new ApplicationDbContext(builder.Options);
}
}
Run Code Online (Sandbox Code Playgroud)
由于配置的注入在这里似乎不起作用(当时我在使用默认Startup类时出现连接字符串错误),因此我编写了一些自定义配置类:
public class Config {
static IConfigurationRoot config;
static IConfigurationRoot AppConfig {
get {
if (config == null) {
config = new ConfigurationBuilder()
.SetBasePath(Directory.GetCurrentDirectory())
.AddJsonFile("appsettings.json")
.Build();
}
return config;
}
}
public static string GetConnectionString(string name) {
var connectionString = AppConfig.GetConnectionString(name);
return connectionString;
}
}
Run Code Online (Sandbox Code Playgroud)
所以问题是,ASP.NET Core 的默认设置ConfigureAppConfiguration并未用于一致性。相反,我的解决方案仅加载appsettings.json,因为在编写此类时,没有使用特定于环境的配置。
我只需要在这里添加加载,如下所示:
static IConfigurationRoot AppConfig {
get {
if (config == null) {
var environmentName = Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT");
config = new ConfigurationBuilder()
.SetBasePath(Directory.GetCurrentDirectory())
.AddJsonFile("appsettings.json")
// https://github.com/aspnet/MetaPackages/blob/rel/2.0.0/src/Microsoft.AspNetCore/WebHost.cs
.AddJsonFile($"appsettings.{environmentName}.json", optional: true, reloadOnChange: true)
.Build();
}
return config;
}
}
Run Code Online (Sandbox Code Playgroud)
如果有人在这里有一个更清晰的解决方案让我ConfigureAppConfiguration在 EF 迁移中使用默认方法,我将不胜感激,因为使用此类默认内容而不是自定义方法时似乎不太容易出错。
| 归档时间: |
|
| 查看次数: |
12749 次 |
| 最近记录: |