繁体   English   中英

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

[英]Using appsettings.ENV.json in .NET Core Console App

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

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

            var dbconnection = config["db"];
}

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

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

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

您要做的第一件事是将 go 放入您的启动设置中。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; }
}

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

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);

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM