在 ASP.NET Core 2.1 中加载 appsettings.{envName}.json 文件

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 特定内容。

Lio*_*ion 5

发现我有一个用于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 迁移中使用默认方法,我将不胜感激,因为使用此类默认内容而不是自定义方法时似乎不太容易出错。