Использование appsettings.ENV. json дюймов NET Core Console App - PullRequest
1 голос
/ 06 мая 2020

Я создаю консольное приложение, чтобы выполнять некоторую работу с базой данных за меня, и хочу настроить разные файлы настроек приложения для хранения соответствующих строк подключения для каждой среды. У меня что-то работает в моей функции Main на данный момент:

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

            var dbconnection = config["db"];
}

Но пока это работает, это всего лишь один глобальный файл настроек приложения. Я хотел бы иметь возможность создавать разные настройки приложений для каждой среды (например, appsettings.Dev.json, appsettings.Staging.json, и c.), Но я не могу понять, как использовать любой выбор, который у меня есть в диспетчере конфигурации, когда Я запускаю приложение со строкой addjsonfile.

Для некоторого дополнительного контекста я хотел бы передать это в свой dbcontext позже в приложении, если это повлияет на что-либо.

Ответы [ 3 ]

2 голосов
/ 06 мая 2020

Другие ответы здесь были полезны, но я хотел подробно рассказать о том, что я сделал для других, которые столкнулись с этим.

Первое, что вам нужно сделать, это go в свой запуск settings. json и добавьте что-то вроде этого:

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

Это даст вам доступ к переменной среды в зависимости от того, с каким профилем вы запускаете свой проект (обратите внимание, что диспетчер конфигурации здесь не влияет).

Затем вы можете создавать различные файлы приложений. 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"];
}

Чтобы сделать еще один шаг вперед, вместо того, чтобы делать это здесь, я сделал контекст базы данных гибкий, например:

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; }
}
1 голос
/ 06 мая 2020

Тот факт, что вы создаете консольное приложение, несущественен: вы бы справились с этим так же, как ASP. NET Core (которое на самом деле тоже является консольным приложением).

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

Здесь env - это экземпляр IHostingEnvironment, который не применим к вашему случаю. Однако его единственная цель - получить значение конфигурации 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);

Вы также можете выбрать настройку в два этапа. В первом раунде вы добавляете переменную среды и / или поставщиков конфигурации аргументов командной строки, создаете этот источник конфигурации, а затем используете его для получения значения среды для второй настройки конфигурации, то есть того, которым вы на самом деле собираетесь быть. с помощью. Это немного излишне для одних только переменных среды, но если вы хотите предоставить возможность предоставления значения через аргументы командной строки, весь этот ручной синтаксический анализ может быть болезненным.

1 голос
/ 06 мая 2020

Вы можете иметь столько файлов конфигурации, сколько хотите, просто добавьте строку кода в свой конструктор конфигурации, как показано ниже:

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

Вам также необходимо настроить имя вашей среды для вашего приложения, как показано ниже:

enter image description here

...