簡體   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