首页 > 解决方案 > 在 .NET Core 控制台应用程序中使用 appsettings.ENV.json

问题描述

我正在构建一个控制台应用程序来为我做一些数据库工作,并希望设置不同的 appsettings 文件来为每个环境存储适当的连接字符串。目前,我的 Main 函数中有这样的工作:

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

            var dbconnection = config["db"];
}

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

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

标签: c#asp.net-coreconfigurationconsole-application

解决方案


这里的其他答案很有帮助,但我想详细说明我为遇到此问题的其他人所做的事情。

您要做的第一件事是进入您的启动 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; }
}

推荐阅读