Внедрить файл конфигурации (IoC) с режимами выполнения - PullRequest
0 голосов
/ 03 мая 2018

У меня есть appsettings.json (и appsettings.development.json позади) в проекте ASP.NET Core. Я хочу внедрить файл конфигурации в зависимости от режима выполнения (производство, разработка ...), как это делает Core, но я хочу получить доступ к JSON через различных проектов , используя IoC .

Используя DI ядра, я имею:

config.AddJsonFile($"appsettings.json", optional: true, reloadOnChange: false)
.AddJsonFile($"appsettings.{environmentName}.json", true, true)
.AddEnvironmentVariables();

И я добавляю IConfiguration в каждый контроллер.

Хорошо, используя Autofac, я попытался добавить ссылку на файл в JSON в другом проекте (где находится контейнер IoC) и протестировать следующий код:

configurationBuilder.AddJsonFile("appsettings.json");

//configurationBuilder.AddJsonFile($"appsettings.json", optional: true, reloadOnChange: false)
//.AddJsonFile($"appsettings.{environmentName}.json", true, true)
//.AddEnvironmentVariables();

var module = new ConfigurationModule(configurationBuilder.Build());
builder.RegisterModule(module);

И

this.container.Resolve<IConfiguration>();

Но я получаю следующую ошибку:

Файл конфигурации 'appsettings.json' не найден и не является обязательным. Физический путь: C: \ Jhon \ source \ Workspaces \ Project \ Development \ Application \ Api \ Api \ bin \ Debug \ netcoreapp2.0 \ appsettings.json '.

1 Ответ

0 голосов
/ 03 мая 2018

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

Как я вижу, самым простым решением является переключение параметра Copy to Output directory файла на Copy Always.

Но у меня есть еще кое-что сказать.

Первый . Если вы используете ASP.NET Core 2.x, вам не нужно писать

config.AddJsonFile($"appsettings.json", optional: true, reloadOnChange: false)
.AddJsonFile($"appsettings.{environmentName}.json", true, true)
.AddEnvironmentVariables();

Потому что BuildWebHost может сделать все для вашего

public static IWebHost BuildWebHost(string[] args) =>
    WebHost.CreateDefaultBuilder(args)
        .UseStartup<Startup>()
        .Build();

Второй Я полагаю, что использование raw IConfiguration не очень хорошая идея. Я бы предпочел параметры шаблон. Это помогает нам разделить нашу логику и код, который извлекает настройки из IConfiguration.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...