Конфигурация для консольных приложений .net Core 2.0
В .net Core 1 мы могли бы сделать это:
IConfiguration config = new ConfigurationBuilder()
.AddJsonFile("appsettings.json", true, true)
.Build();
И это дало использование объекта Configuration, который мы могли бы использовать в нашем консольном приложении.
Все примеры для .net core 2.0, похоже, адаптированы к новому способу создания конфигурации Asp.Net.
Каков способ создания конфигураций для консольных приложений?
Обновление: этот вопрос не связан с ядром Asp.net. Пожалуйста, не добавляйте теги asp.net core при редактировании.
Ответы
Ответ 1
Кажется, нет никаких изменений, как говорит Иегоф.
ConfigurationBuilder находится в своем собственном пакете, как говорит Jeroen Mostert.
Но убедитесь, что у вас также есть пакет Microsoft.Extensions.Configuration.Json, в котором живет расширение .AddJsonFile().
В общем, вам нужны следующие два пакета NuGet:
- Microsoft.Extensions.Configuration(2.0.0)
- Microsoft.Extensions.Configuration.Json(2.0.0)
Ответ 2
Сохраните private static IServiceProvider provider;
в программе Program.cs. Затем настройте конфигурацию так же, как в ядре aps.net, но, конечно же, вы сделаете это в Main(). Затем настройте каждый раздел внутри своего IServiceProvider. Таким образом вы можете использовать инъекцию зависимостей конструктора. Также обратите внимание, что у меня две конфигурации в моем примере с поливом. Один содержит секреты, которые должны храниться вне контроля источника и храниться вне структуры проекта, и у меня есть AppSettings, который содержит стандартные параметры конфигурации, которые не должны быть закрытыми. (Важно!)
Если вы хотите использовать конфигурацию, вы можете извлечь ее из поставщика или вытащить объект из поставщика, который использует ваши классы настроек в своих конструкторах.
private static IServiceProvider provider;
private static EventReceiver receiver;
static void Main(string[] args)
{
IConfigurationRoot config = new ConfigurationBuilder().SetBasePath(Directory.GetCurrentDirectory())
.AddJsonFile(path: "/opt/Secrets.json", optional: false, reloadOnChange: true)
.AddJsonFile(path: "AppSettings.json", optional: false, reloadOnChange: true)
.Build();
provider = new ServiceCollection()
.AddSingleton<CancellationTokenSource>()
.Configure<Settings>(config.GetSection("SettingsSection"))
.BuildServiceProvider();
receiver = new EventReceiver<Poco>(ProcessPoco);
provider.GetRequiredService<CancellationTokenSource>().Token.WaitHandle.WaitOne();
}
private static void ProcessPoco(Poco poco)
{
IOptionsSnapshot<Settings> settings = provider.GetRequiredService<IOptionsSnapshot<Settings>>();
Console.WriteLine(settings.ToString());
}
это зависимости, которые я рекомендую начинать с создания приложения dotnetcore cli.
<PackageReference Include="Microsoft.Extensions.Configuration" Version="2.0.0" />
<PackageReference Include="Microsoft.Extensions.Configuration.Json" Version="2.0.0" />
<PackageReference Include="Microsoft.Extensions.DependencyInjection.Abstractions" Version="2.0.0" />
<PackageReference Include="Microsoft.Extensions.Logging" Version="2.0.0" />
<PackageReference Include="microsoft.extensions.logging.abstractions" Version="2.0.0" />
Также обратите внимание, что вам нужно будет скопировать настройки в свои публикации и создавать каталоги. Вы можете сделать это, добавив цели в свой файл csproj.
<Target Name="CopyToOut" BeforeTargets="BeforeBuild">
<Copy SourceFiles="../ProjPath/AppSettings.json" DestinationFolder="$(TargetDir)" SkipUnchangedFiles="true" />
</Target>
<Target Name="CopyToOutOnPublish" AfterTargets="Publish">DestinationFolder="$(PublishDir)" SkipUnchangedFiles="true" />
<Copy SourceFiles="../ProjPath/AppSettings.json" DestinationFolder="$(PublishDir)" SkipUnchangedFiles="true" />
</Target>