/// <summary> /// Add json file settings based on current environment and the specified /// environment inheritance layers. /// If environments param is null, only appsettings.json will be added. /// </summary> /// <param name="configBuilder">config builder</param> /// <param name="environments">array of defined environments</param> /// <returns>config builder</returns> private static IConfigurationBuilder AddJsonFiles( this IConfigurationBuilder configBuilder, IEnumerable <HostEnvironment> environments) { var currentEnvName = HostEnvironment.Environment; // Try to look the current environment up from the given environment list var env = environments?.FirstOrDefault(e => string.Equals(e.Name, currentEnvName, StringComparison.OrdinalIgnoreCase)); if (env == null) { // If the current environment cannot be found from the environments list, we fall back to // the .net core behavior by creating a temp environment using current environment's name. env = new HostEnvironment(currentEnvName); } // Find the layering hierarchy (sigle direction list from children to parent), then reverse it (parent to children). var layers = new List <HostEnvironment>(); while (env != null) { layers.Add(env); env = env.Parent; } layers.Reverse(); // Add json files based on parent to child chains. Note appsettings.json is always included first. configBuilder.AddJsonFile("appsettings.json", optional: true, reloadOnChange: false); foreach (var environment in layers) { configBuilder.AddJsonFile($"appsettings.{environment.Name}.json", optional: true, reloadOnChange: false); } return(configBuilder); }
/// <summary> /// Initializes a new Environment object /// </summary> /// <param name="name">environment name which is set in IHostEnvironment</param> /// <param name="parent">Parent environment, can be null and defaults to null</param> public HostEnvironment(string name, HostEnvironment parent = null) { this.Name = name ?? throw new ArgumentNullException(nameof(name)); this.Parent = parent; }