在 .NET Core 控制台应用程序中使用 appsettings.ENV.json

Using appsettings.ENV.json in .NET Core Console App

我正在构建一个控制台应用程序来为我做一些数据库工作,并且想要设置不同的应用程序设置文件来为每个环境存储适当的连接字符串。我现在在我的主要功能中有这样的东西:

static void Main(string[] args)
{
            IConfiguration config = new ConfigurationBuilder()
              .AddJsonFile("appsettings.json", true, true)
              .Build();

            var dbconnection = config["db"];
}

但是虽然这有效,但它只是一个全局应用程序设置文件。我希望能够为每个环境创建不同的应用程序设置(例如 appsettings.Dev.jsonappsettings.Staging.json 等),但我不知道如何提供配置管理器中的任何选择当我 运行 将应用程序添加到 addjsonfile 字符串时。

对于一些额外的上下文,我想稍后在应用程序中将其输入到我的 dbcontext 中,如果这会影响任何内容的话。

您可以拥有任意数量的配置文件,只需将一行代码添加到您的配置生成器中,如下所示:

IConfiguration config = new ConfigurationBuilder()
          .AddJsonFile("appsettings.json", false)
          .AddJsonFile($"appsettings.{environmentName}.json", true)
          .Build();

您还需要为您的应用程序配置环境名称,如下所示:

您正在构建控制台应用程序这一事实无关紧要:您可以像 ASP.NET 核心应用程序(实际上也只是一个控制台应用程序)一样处理它。

.AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
.AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true, reloadOnChange: true);

这里,envIHostingEnvironment的一个例子,不适用于你这里的情况。但是,它的唯一目的是获取作为 environment 配置值的值。该值可以通过多种方式设置,最典型的是通过 ASPNETCORE_ENVIRONMENT 环境变量。但是,它也可以作为命令行参数传递。由于您正在此处构建控制台应用程序,因此您可以随心所欲地提供它。最后,您只需获取环境值并将其分入 AddJsonFile 调用中的文件名。

// get environment value from either `Environment.GetEnvironmentVariable` or by parsing command line arguments

.AddJsonFile($"appsettings.{myEnvironment}.json", optional: true, reloadOnChange: true);

您也可以选择分两轮进行配置。在第一轮中,您添加环境变量 and/or 命令行参数配置提供程序,构建该配置源,然后使用它来提取第二个配置设置的环境值,即您实际要去的那个正在使用。这对于单独的环境变量来说有点矫枉过正,但如果你想提供通过命令行参数提供值的选项,那么所有手动解析都会很痛苦。

此处的其他答案很有帮助,但我想详细说明我为遇到此问题的其他人所做的工作。

您要做的第一件事是进入发布 settings.json 并添加如下内容:

{
  "profiles": {
    "DataMigration (Local)": {
      "commandName": "Project",
      "environmentVariables": {
        "ASPNETCORE_ENVIRONMENT": "Local"
      }
    },
    "DataMigration (Dev)": {
      "commandName": "Project",
      "environmentVariables": {
        "ASPNETCORE_ENVIRONMENT": "Dev"
      }
    }
  }
}

这将使您能够访问环境变量,具体取决于您启动项目时使用的配置文件(注意配置管理器在这里没有影响)。

然后您可以创建不同的 appsetting.json 文件。例如,我制作了一个 appsettings.Local.json 和一个 appsettings.Dev.json 文件。

appsettings.Local.json

{
  "db": "connectionstringhere"
}

appsettings.Dev.json

{
  "db": "connectionstringhere"
}

现在,您可以像这样访问 运行 您的应用的环境变量:

static void Main(string[] args)
{
    var myEnv = System.Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT");
    IConfiguration config = new ConfigurationBuilder()
        .AddJsonFile($"appsettings.{myEnv}.json", false)
        .Build();

    var dbconnection = config["db"];
}

为了更进一步,我没有在这里做,而是通过 db context 灵活地像这样:

public class ShoppingDbContext : DbContext
{
    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    {
        var myEnv = System.Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT");

        if(myEnv != null)
        {
            IConfiguration config = new ConfigurationBuilder()
                 .AddJsonFile($"appsettings.{myEnv}.json", false)
                 .Build();

            var sl = config[$"db"];
           optionsBuilder.UseSqlServer(sl);
        }
        else
        {
            // we are testing and want local for sure
            IConfiguration config = new ConfigurationBuilder()
                 .AddJsonFile($"appsettings.Local.json", false)
                 .Build();

            var sl = config[$"db"];
            optionsBuilder.UseSqlServer(sl);
        }
    }

    public DbSet<MyTable> MyTables { get; set; }
}