Добавьте связанный appsettings.json

У меня есть несколько проектов, которые используют один и тот же файл appsettings.json.

Когда я добавляю файл appsettings.json в каждый проект отдельно, мои проекты запускаются и загружают конфигурацию из этих файлов.

Я хотел бы иметь один файл, на который я ссылаюсь (Добавить -> Существующий -> Добавить как ссылку), чтобы у меня был один единственный файл для обслуживания.

При этом мой файл .proj изменяет файлы:

<ItemGroup>
<Content Include = "..\Master\appsettings.Development.json" Link = "appsettings.Development.json">
  <CopyToOutputDirectory>Always</CopyToOutputDirectory>
</Content>
<Content Include = "..\Master\appsettings.json" Link = "appsettings.json">
  <CopyToOutputDirectory>Always</CopyToOutputDirectory>
</Content>

Когда я делаю сборку, я вижу оба параметра приложения в каталоге bin\Debug\netcoreapp3.1.

Мой стартап:

public static void Main(string[] args)
{
    ServicePointManager.ServerCertificateValidationCallback += (sender, cert, chain, sslPolicyErrors) => true;
    CreateHostBuilder(args).Build().Run();
}

public static IHostBuilder CreateHostBuilder(string[] args) =>
        Host.CreateDefaultBuilder(args)
            .ConfigureServices((hostContext, services) =>
            {
                var lConfiguration = hostContext.Configuration;

                ServiceConfiguration lOptions = lConfiguration.GetSection(nameof(ServiceConfiguration)).Get<ServiceConfiguration>();
                services.AddSingleton(lOptions);

            })
            .UseSerilog((hostingContext, loggerConfiguration) =>
                    loggerConfiguration.ReadFrom.Configuration(hostingContext.Configuration)
                );

Однако, когда я отлаживаю свой проект и проверяю объект конфигурации, я вижу все источники конфигурации, но источник appsettings пуст.

Я в замешательстве, так как файл appsettings строится, но конфигурация его не подхватывает.

Что мне не хватает?

Как вы строите свою конфигурацию? Это должно выглядеть примерно так: new ConfigurationBuilder().SetBasePath(Directory.GetCurrentDirec‌​tory()).AddJsonFile(‌​"appsettings.json").‌​AddJsonFile($"appset‌​tings.{Environment.G‌​etEnvironmentVariabl‌​e("ASPNETCORE_ENVIRO‌​NMENT")}.json", optional: true).AddEnvironmentVariables().Build();

Peter Csala 15.12.2020 15:30

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

WynDiesel 15.12.2020 15:34

@PeterCsala нет, я думаю, вы неправильно понимаете концепцию или мое объяснение. Итак, у меня есть один файл настроек приложения, который живет внутри моего «главного» проекта. в других проектах нет файла appsettings.json в исходном каталоге. Когда проект(ы) строится, он извлекает настройки приложения из папки «главного» проекта и помещает их в двоичную папку. Эта механика работает отлично. Реализация в Visual Studio для этого также великолепна. Кажется, что файлы есть везде, но на самом деле это один файл. Когда редактируешь, меняется везде. Я опубликую ответ на это сейчас.

WynDiesel 17.12.2020 08:33

Извините, я неправильно понял ваше намерение.

Peter Csala 17.12.2020 09:23
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
4
975
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Проблема заключалась в том, что рабочим каталогом в .NET Core по умолчанию является исходная папка, а не папка с двоичными файлами. Это означает, что он искал файл appsettings.json в моей исходной папке, который был бы там, если бы я добавил файл appsettings вручную, но когда я связал его, его не было в исходной папке.

Проблема была решена путем изменения рабочего каталога по умолчанию на двоичную папку, выполнив следующие действия:

Directory.SetCurrentDirectory(Path.GetDirectoryName(Assembly.GetEntryAssembly().Location));

Есть еще один способ, с помощью которого вы можете контролировать, откуда будет запускаться приложение. Вы можете изменить файл launchSettings.json, чтобы добавить настройку workingDirectory в свой профиль запуска. Просто укажите его в выходной папке bin:

{
  "profiles": {
    "Project1": {
      "commandName": "Project",
      "workingDirectory": "bin/Debug/net6.0",
      "dotnetRunMessages": true,
      "environmentVariables": {
        "DOTNET_ENVIRONMENT": "Development"
      }
    }
  }
}

Другие вопросы по теме